InputFormat简析

0 引子:

hadoop把处理的文件读取到并解析成键值对,这个操作是通过InputFormat类的子类实现的。


在执行一个Job的时候,Hadoop会将处理的数据(存放在hdfs中)划分成N个Split,
然后启动相应的N个Map程序来分别处理它们,
默认下hdfs中的一个block就会被划分为一个Split,

现在的问题是:
a)被处理的hdfs数据如何被划分
b)Split对应的Map程序应该被分配到哪台TrackTracker机器上
c)划分后数据如何被读取到

具体解释如下:

mr根据传入具体XXInputFormat方式来对hdfs目标文件切分(egTextInputFormat),每个split对应一个

block,并记录block对应文件名,起始位置,文件长度,所在的节点HOSTS

切分好后形成一系列的map reduce任务,taskertracker通过心跳机制和jobtracker定期交互,

告诉jobtracker其资源使用情况,map reduce任务执行情况,后jobtracker根据其调度策略,

比如要分配任务对应spl;it的host位置和tasktracker的位置,以及tasktracker资源,同时优先将

执行失败的map任务提交给非执行失败的节点等统筹优先发送map任务给tasktracker节点。

tasktracker节点通过 getRecorder方法,将split的文件,起始位置,长度等信息最后交给hdfs dfsclient之手,

交给hdfs来执行读取文件操作, dfsclient将数据发送给namenode节点,namenode节点在决定

返回哪个datanode节点,然后和具体datanode节点对接上后执行对应文件内容的读取操作。

为何要切分:  文件切分后,能发挥并行处理优势的目的,

切分后形成的每一个inputsplit都会被分配到独立的mapper

但是mapper接受的是键值对, 那么inputslipt如何转换成键值对的呢??是由recordreader完成

InputFormat 两个函数: 一个切分成split  每一个split交给一个mapper  另一个是读取,

                                           将切分好的split读取到真正的文件内容 并变成键值对给mapper

子类结构为:

 
InputFormat简析
 

 

1 map-reduce执行流程:

 
InputFormat简析
 

 解释如下:

1、运行mapred程序;
2、本次运行将生成一个Job,于是JobClient向JobTracker申请一个JobID以标识这个Job;
3、JobClient将Job所需要的资源提交到HDFS中一个以JobID命名的目录中。这些资源包括JAR包、配置文件、InputSplit、等;
4、JobClient向JobTracker提交这个Job;
5、JobTracker初始化这个Job;
6、JobTracker从HDFS获取这个Job的Split等信息;
7、JobTracker向TaskTracker分配任务;
8、TaskTracker从HDFS获取这个Job的相关资源;
9、TaskTracker开启一个新的JVM;
10、TaskTracker用新的JVM来执行Map或Reduce;

a)被处理的hdfs数据如何被划分

何被划分

相关推荐