MapReduce 关于MapReduce
MapReduce是离线批处理大规模数据的编程模型,MapReduce程序是并行运行的
map和reduce
任务过程分为两个阶段:map阶段和reduce阶段,每个阶段都是以键值对作为输入输出,要编写两个函数:map函数和reduce函数
下图为MapReduce的逻辑数据流,底部是Unix管线,模拟流程
Java MapReduce
map函数 + reduce函数 + 运行作业的代码
实现Mapper类的map方法 + 实现Reducer类的reduce方法 + Job实例设定执行规范,控制作业的运行
术语
1) job作业:客户端需要执行的一个工作单元,包括输入数据,MR程序和配置信息
2) task任务:Hadoop将job分成若干任务,包括map task和reduce task两类任务
任务运行在集群节点上,通过YARN来调度, 如果一个任务失败,会在另一个节点上自动重新调度运行
3) input split输入分片/分片:将MR的输入数据划分成等长的小数据块,每一块都是一个input split,Hadoop为每个分片创建一个map任务,该任务运行定义的map函数处理分片的每条记录
4) 数据本地化:Hadoop在存储有输入数据的节点上运行map任务,可以获得最佳性能,因为无需集群带宽资源,这就是“数据本地化优势”
5) partition分区:如果reduce任务有多个,map任务可以针对输出进行分区(patititon),为每个reduce任务创建一个分区,分区有多个键,每个键对应的键值记录都在同一个分区。分区可以由分区函数(默认为Hash函数)分区
6) shuffle混洗:map任务和reduce任务之间的数据流成为shuffle,调整混洗参数对作业运行时间影响很大
7) 无reduce任务:当map任务完全并行时,可能无需reduce任务,唯一的非本地节点传输是map任务结果输出到HDFS
8) combiner函数:为尽量避免map任务和reduce任务的数据传输,为map任务指定combiner函数,将combiner函数输出作为reducer任务输入。combiner做中间处理,但不能影响reduce任务的结果。在Java MR中,由Reducer类定义combiner,Job设置serCombinerClass为对应的Reducer类
分片的作用
1) 并行处理分片,降低处理时间
2) 切片被分的越细,负载均衡的质量越高
3) 如果分片太小,可能管理分片的时间和创建map任务的时间则会影响作业的执行时间,合理的分片大小等于HDFS块大小,默认128M,可以避免不同节点/机架/数据中心数据的传输
为什么map任务输出写到本地磁盘不写到HDFS?
map任务输出只是中间结果,将中间结果放到HDFS并实现备份,小题大做,reduce任务的输出才是最终结果,需要写到HDFS可靠存储,任务完成后,中间结果可以删除
reduce任务
reduce任务不具备数据本地化的优势,因为输入都是来自于排过序的map任务的输出,所以总是会有节点间的网络传输,数据在reduce节点合并,reduce函数处理,最终结果可靠存储到HDFS上,第一个副本存储在本地节点,其他副本可以存储在其他机架节点上,输出写入HDFS占用网络带宽,与HDFS管线写入一样
如下图,reduce任务个数可以指定,单个reduce任务,两个reduce任务,无reduce任务的MR数据流,大虚线框表示节点,虚线箭头表示节点内部数据传输,实线表示节点间数据传输
================================================================================================================
================================================================================================================
Hadoop Streaming
Hadoop Streaming使用Unix标准流作为Hadoop和应用程序间接口,可以使用任何语言通过标准I/O编写MR程序
比如Ruby/Python编写MR程序