需求:
在给定的文本文件中统计输出每一个单词出现的总次数
- 输入数据
zhou zhi xiong
duan xing yu
zhou xiong xiong
- 期望输出数据
zhou 2
zhi 1
xiong 3
duan 1
xing 1
yu 1
需求分析
按照MapReduce编程规范,分别编写Mapper,Reducer,Driver
- Mapper
- 将MapTask传给我们的文本内容先转换成String
- 根据空格将这一行切分为成单词
- 将单词输出为<单词,1>
- Reducer
- 汇总各个key的个数
- 输出各个key的总次数
- Driver(固定套路)
- 获取配置信息,获取job对象实例
- 设置类路径
- 关联Mapper/Reducer业务类
- 指定Mapper输出数据的kv类型
- 指定最终输出的数据的kv类型
- 指定job的输入原始文件所在目录
- 指定job的输出结果所在目录
- 提交job作业
环境准备
- 创建maven工程
点击next
点击next,最后点击finshed
- 在pom.xml文件中添加如下依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
</dependencies>
- 在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
- 在java包底下新建名为com.redhat.wordcount的包
- 在com.redhat.wordcount包下建立Wcmapper、WcReducer、WcDriver三个类