u011480104的专栏

最近开始入门hadoop框架。 做点笔记!

MapReduce编程模型分为5个步骤:

1.迭代。遍历输入数据,并将之解析成 key/value 对

2.将输入数据 key/value 对映射成另外一些 key/value 对

3.依据 key 对中间数据进行分组

4.以组为单位对数据进行归纳

5.迭代。将最终产生的key/value对保存到输出文件中

Hadoop主要分为5个编程组件,分别是InputFormat、Mapper、Partitioner、Reducer、OutputFormat。大部分情况下用户只需要编写Mapper和Reducer。

InputFormat:主要的设计思路是由公共基类FileInputFormat采用统一的方法对各种输入文件进行切片(例如按照统一的固定大小),由派生InputFormat自己提供的机制将进一步解析InputSplit.

其核心有两个算法,分别是文件切分算法和host选择算法。

文件切分算法:用于确定InputSplit的个数以及每个InputSplit对应的数据段。由三个属性确定

goalSize:期望的InputSplit个数。由TotalSize(文件总大小)/numSplits(用户设定的Map task 个数)计算而来的。

minSize: InputSplit的最小值。(由配置文件mapred.min.split.size决定,默认1)

blockSize:文件在HDFS存储的block(块)大小。默认64MB

splitSize = max{minSize, min{goalSize, blockSize}}

而新版的API不考虑Map Task个数,用mapred.max.split.size(maxSize)。公式变为

splitSize = max{minSize, min{maxSize, blockSize}}

Host选择算法:确定每个InputSplit的元数据信息(InputSplit所在文件,起始位置,长度,所在节点)。由于HDFS上的文件是用block来存储的,,所以InputSplit切分算法可能导致一个InputSplit分布在多个block上,而且这些Block可能分布在不同的节点上,这样可能使得总有一部分的数据得从远程节点上读取,所以为了提高Map Task数据的本地性,应尽量使InputSplit大小与Block大小相同。

然后通过RecordReader将InputSplit解析成一个个 key/value 对。(key为文件偏移量,value为每一行的内容)

OutputFormat:用于描述输出数据格式,将用户提供的key/value对写入特定格式的文件中。

1).checkOutputSpecs:在任务运行前,检查用户配置的输出目录是否存在。

2).side-effect file:在执行任务时如果某个节点因为一些原因导致任务执行速度过慢,Hadoop会在另一个几点启动一个相同的任务,为了防止这两个任务同时往一个输出文件写入数据时出现冲突,会为每个Task的数据创建一个side-effect file,将产生的数据写入该文件。待Task完成

后再移动到输出目录。

Mapper/Reducer:将存储在底层分布式文件系统上key/value的数据形式交给map/reduce函数处理,产生另外一些key/value

Partitioner:对Mapper产生的中间结果进行分片,以便将同一分组的数据交给同一个Reducer处理,它直接影响到

Reduce阶段的负载均衡。

——————————————————————————————————————————————————————————————–参考《Hadoop技术内幕》

莫找借口失败,只找理由成功。

u011480104的专栏

相关文章:

你感兴趣的文章:

标签云: