MapReduce 处理阶段
MapReduce 框架通常由三个阶段组成:
- Map:读取文件数据,按照规则对文本进行拆分,生成 KV 形式的数据。
- Shuffle:工作节点根据输出键(由 map 函数生成)重新分配数据,对数据排序、分组、拷贝,目的是属于一个键的所有数据都位于同一个工作节点上。
- Reduce:工作节点并行处理每个键的一组数据,对结果进行汇总。
下图把 MapReduce 的过程分为两个部分,而实际上从两边的 Map 和 Reduce 到中间的那一大块都属于 Shuffle 过程,也就是说,Shuffle 过程有一部分是在 Map 端,有一部分是在 Reduce 端。
案例统计单词出现的次数
数据
hello hbase
hello hadoop
hello hive
hello kubernetes
hello java
原理图
wordcount 代码实现
用户编写的 MapReduce 程序分成三个部分:Mapper,Reducer,Driver:
- 用户自定义 Mapper 类继承 Mapper 类,实现 map() 方法,输出和输出的数据都是
<K,V>
对形式,<K,V>
类型可以根据实际情况自定义。MapTask 进程对每一个<K,V>
调用一次。 - 用户自定义 Reduce 类继承 Reduce 类,实现 reduce() 方法,输出和输出的数据都是
<K,V>
对形式,<K,V>
类型可以根据实际情况自定义。Reducetask 进程对每一组相同 K 的<K,V>
组调用一次 reduce() 方法。 - 整个 MapReduce 程序需要一个 Drvier 类来进行提交,提交的是一个描述了各种必要信息的 Job 对象。
在 HDFS 中创建目录并上传文件
在 HDFS 中创建一个目录
hadoop fs -mkdir /wcinput
#将本机 words.txt 文件上传到 HDFS 的 /wcinput 目录中
hadoop fs -put /words.txt /wcinput