MapReduce
hadoop
《权威指南》
! All pictures are screenshots from the book 'Hadoop: The Definitive Guide, Fourth Edititon, by Tom White(O'Reilly).Copyright©2015TomWhite, 978-1-491-90163-2'
Map和Reduce
- 任务过程分为map和reduce两个阶段,每阶段都以键值对最为输入和输出,其类型由程序员来选择
- Java MapReduce
横向扩展
为了实现横向扩展,我们需要将数据存储在分布式文件系统中(如HDFS),通过YARN,hadoop,可以将MR计算转移到存储有部分数据的各台机器上
数据流
- 作业(job)
- 是客户端执行的一个工作单元:包括输入数据、MR程序和配置信息
- hadoop将作业分成若干个任务(map和reduce两类),任务运行在集群的节点 上,由YARN来进行调度;若一个任务失败,就会在另一个不同的节点上自动重新调度运行
- hadoop将MR的输入数据切分成输入分片(趋向于一个块的大小,默认128mb),并为每一个分片构建一个map任务
- 数据本地化最优: 在存储有输入数据(HDFS中的数据)的节点上运行map任务,可以获得最佳性能,因为它无需使用宝贵的集群宽带资源
- 最佳分片的大小应该与块的大小相同,因为这样可以避免数据需要进行网络传输
- map任务将其输出写入到本地硬盘而不是HDFS,这是因为map的输出只是一个中间结果,一旦作业完成,就可以直接删除,因而不需要存储到HDFS
- reduce任务
- 不具备数据本地化的优势,单个reduce任务的输入通常来自于所有mapper的输出
- 输出通常存储在HDFS中以实现可靠存储
- reduce任务的数量并非由输入数据的大小决定,而是独立指定的
combiner函数
- 集群上的可用带宽限制了MR作业的数量,因此尽量避免map和reduce任务之间的数据传输是有利的
- combiner函数不能取代reduce函数,但是可以版主减少mapper和reducer之间数据传输量。
- combiner属于优化方案,其规则制约着可用的函数类型,例如计算平均值的函数。
hadoop steaming
hadoop streaming使用Unix标准流作为hadoop和应用程序之间的接口,因而我们可以使用任何编程语言通过标准输入/输出来写MR程序