打开IDEA,File——new ——Project,新建一个项目

我们已经安装好了maven,不用白不用

这里不要选用骨架,Next。在写上Groupid,Next。

写上项目名称,finish。ok。

一个项目就建好了,他长这样:

新建的项目要配置一下maven。毕竟我们马上就要用它。然后导入依赖

打开pom.xml

不愿意一个一个敲的话,可以使用cv大法。

<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>

等待下载的时候我们可以创建项目了。打开src——main——java,右键Package,我们在这里新建一个package。我们在这里包里面写一个wordcount的案例

名字就叫MR

.

mr下再建一个包:wc。如图:

在wc下新建一个java类:wcMapper。这个类负责读取单词,生成map(键值对)

再创建一个wcReduce类。这个类负责聚合,把key相同的数据放到一起,并且累加value。

再创建一个wcDriver类,驱动类主要用于关联Mapper 和 Reducer 以及 提交整个程序。就像这样:

在写代码之前,我们先看一个mapreduce编程规范:

继续看代码,我们先写wcMapper类

package MR.wc;

/**
* 按行读取数据,拆成一个一个的单词
* */
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**继承Mapper类,这个类要是hadoop.mapreduce.Mapper
* 这里有一个泛型, Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>KEYIN,VALUEIN 规定数据是以什么类型进入map程序(MR程序提供了几种类型)
* KEYIN这个参数表示读取文件的行数,一般是数字类型。由于是文件可能会很大,一般不用int,而是用long
* VALUEIN这个参数表示读取数据的格式,也就是单词的格式,这里就是字符串
* 我们的对象要在节点之间通过网络传输,就需要序列化。但是java的序列化是一个重量级序列化框架,一个对象被序列化后,会附带很多额外的信息
* (各种校验信息,header,继承体系等),不便于在网络中高效传输。所以hadoop开发了一套序列化机制(writable),精简,高效
*
*
*/
public class wcMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
Text ko=new Text();
IntWritable vo=new IntWritable(1);//value值默认为1
//重写map方法,key跟value是我们读取进来的数据,数据处理玩以后就放到congtext(上下文)里面
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
//读取到的这一行数据先转成String类型
String line = value.toString();
//按照空格切分单词
String[] words = line.split(" ");
//处理数据
for (String word : words) {
//keyout设置成单词
ko.set(word);
//通过上下把处理好的数据写出
context.write(ko,vo);
}
}}

到这里,map这个过程就写完了,这个过程就实现了按行读取数据,并且把单词转化成了key,value的形式,给每个单词的value值标成了1,然后通过上下文把数据写出,在wc这个程序中,实际上就是把这个key,value传给了wcRecude。让reduce过程去按照key聚合value。

常用java类型对应的HadoopWritable类型:

最新文章

  1. RabbitMQ学习系列(六): RabbitMQ 高可用集群
  2. PCB Layout高速电路设计小知识点
  3. sql2000 (附加数据库)错误9003:LSN(434:94:1)无效和数据库置疑处理
  4. Objective-C objc_class 介绍
  5. 【MPI学习3】MPI并行程序设计模式:不同通信模式MPI并行程序的设计
  6. C - Surprising Strings
  7. ubuntu配置bridge网桥
  8. poj 1018 Communication System_贪心
  9. Java 重入锁 ReentrantLock
  10. STURTS2 HELLOWORLD
  11. 在cmd模式下对mysql的操作语句
  12. 从PRINCE2引起项目失败的共性原因?
  13. C# -Asp.Net.SignalR.Core之Hub
  14. 黄聪:mysql主从配置(清晰的思路)
  15. 小项目分析之C++ 实现模拟银行排队
  16. JS知识整理之 Call&amp;Apply方法
  17. Apache+PHP+MySQL+phpMyAdmin+WordPress搭建
  18. nginx配置文件详解(三)
  19. Android Hook框架adbi源码浅析(一)
  20. 关于STRUCT优化的一个点

热门文章

  1. Golang 的 `[]interface{}` 类型
  2. 使用echo 无法正确清空文件存储大小
  3. Spring Boot 3.0.0 M3、2.7.0发布,2.5.x将停止维护
  4. 【转】理解 CI 和 CD 之间的区别
  5. point pair feature在2D图像匹配中的应用
  6. python基础学习6
  7. 一个全新的Vue拖拽特性实现:“调整尺寸”部分
  8. 架构师必备:系统容量现状checklist
  9. 【Spring】事务的执行原理(二)
  10. VSCode配置远程免密登陆