InputFormat和OutPutFormat

InputFormat主要用于对输入数据的描述。提供了两个功能。

1,数据的切片。InputFormat按照某个策略,将输入数据切分为若干个split,Map任务的个数和split的个数相对应。

Inputformat中对应getSplits的方法,完成数据切分的功能。归于inputsplit有两个特点。

A,逻辑分片。Inputsplit只是在逻辑上对输入的数据进行分片,并不会在磁盘上将其切分,inputspli只是记录了分片的元数据信息,比如说起始位置,长度和节点的列表等。

B,可序列化。Inputsplit序列化以方便进程间通信。作业提交的时候,inputsplit会序列化到文件中,在map任务启动前,初始化的时候可以直接读取文件。

inputformat的FileInputFormat中inputsplit的切分过程。

FileInputFormat的切分主要包括两个方面,一是文件的切分。二是host的选择。

文件的切分,主要是要确认每一个切片的大小splitSize,切片的数量为文件的大小/splitSize。hadoop中切片的大小是如下确认的:

splitSize=max{minSize,min{maxSize,BlockSize}};

其中minSize和maxSize可以进行配置,BlockSize是hdfs中每个block的大小。

host选择算法直接印象运行过程中任务的本地性。hadoop对本地性划分为3个等级,node,rack,datacenter。host在选择的时候是选择包含该inputsplit数据总量最大的前几个节点

2,位Mapper提供输入数据。通过某个给定的split,能够将其解析成一个个的key/value对。inputformat中另外一个方法是getRecordReader;通过传入inputsplit,返回recordReader对象。Map任务执行过程中,就是通过不断的调用RecordReader的方法迭代获取key/value.

顺便说一下outputformat。

outputformat中主要包括两个方法1,getRecoreWrite。2,checkOutputSpecs。

checkOutputSpecs主要检查输出目录是否合法,一般在作业提交之前会被调用,如果目录已经存在就会抛出异常,放置文件被覆盖。

fileOutPutFormat的实现中为了放置推测式的任务产生冲突,会为每个task任务数据创建side-effect,将产生的数据临时写入该文件,等task完成后在移动到最终输出任务。

posted @ 2017-08-11 22:29  依米熊  阅读(3581)  评论(0编辑  收藏  举报