1. map 和 reduce
- MapReduce 任务过程分为两个处理阶段:map阶段和reduce阶段。每阶段都以键-值对座位输入和输出,其类型由程序员来选择。程序员还需要写两个函数:map函数和reduce函数。
- map阶段,将数据集的每一行座位文本输入。键是某一行起始位置相对文件起始位置的偏移量(通常不需要这个信息,可以忽略)。map函数是一个数据准备阶段,取得需要的数据,筛选缺失的,可疑的或者错误的数据,对键值对做排序分组输出。
- reduce阶段,遍历整个map输出列表,从中找到最多值,或进行合并排序,生成新的键值对输出。
2. Java MapReduce
-
Maper
-
Reducer
-
运行MapReduce作业
import java.io.IOException;
- 运行测试
% export HADOOP_CLASSPATH=hadoop-examles.jar
% hadoop MaxTempreture input/ncdc/sample.txt output
3. 数据流
- 术语
- job: MapREduce 作业,是客户端需要执行的一个工作单元,包括输入数据,MapReduce 程序和配置信息。
- task: map 任务和 reduce 任务,任务运行在集群的节点上,通过YARN 进行调度,如果一个任务失败,将会在另一个不同的节点自动重新调度运行。
- map 任务
- Hadoop 将 MapReduce 的输入数据划分成等长的小数据块(输入分片), 为每一个分片构建一个map任务,来执行map函数对分片数据的处理逻辑。切片分得越细,负载均衡的质量越高,不过分的太小管理分片的总时间和构建 map 任务的总时间会变长。一个合理的大小趋向于HDFS一个块的大小(128MB),保证一个分片的数据在同一个HDFS 节点上。Hadoop 在存储有输入数据的节点上运行map任务可以避免集群带宽资源的损耗,从而获得最佳性能。map的输出写入本地磁盘,而非HDFS。该输出只是中间结果,一旦 job 完成,该输出就可以删除。
- reduce 任务
- reduce 任务不具备本地化优势(需通过网络传输到reduce task 的节点),单个 reduce 任务的输入通常来自所有map 的输出。reduce 的第一个副本存储在本地节点,其他副本处于可靠性考虑,存储在其他机架的节点上。多个 reduce 任务的输入来自每个 map 输出分区(shuffle)后的输出,每个reduce 分区有许多键,而单个键都在同一个分区(用户定义的分区函数或partitioner)。当输出处理可以完全合并,无需shuffle时,可能会出现无 reduce 任务,map 任务的结果会直接写入HDFS。
- combiner 函数
网友评论