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完成后在移动到最终输出任务。