MR中一个InputSplit对应着一个map任务,而一个InputSplit可能包含一个或者多个block,block是HDFS对数据的物理划分而InputSplit是MR对文件的逻辑划分,通常来说InputSplit的大小和block的大小相同最适宜。其中单个 block 的操作是本地操作,将更多的时间用于计算,而不是数据传输。也就是说这个map任务在运行的过程中只从本节点上读取所需要的数据,而不会与其他节点进行通信获取数据,map任务之间的独立性,对任意一个map任务,都会在单独的Java进程中被初始化,map之间也不会进行通信。那同样对于reduce任务也是的,其中在reduce中不同key关联的value list 操作也是相互独立的。这种任务独立性就保证了容错性,TaskTracker定时会以心跳的方式向JobTracker通信,超过这个时间JobTracker任务这个任务失败,在其它地方重新执行这个任务,不需要任务的中间状态,而是直接重启,这个节点的选择也要考虑到数据所在的节点位置,尽量保证数据本地性,移动代码而不是移动数据。
独立性也可以扩展到cluster node上面,也就是执行mapper或reducer的过程,(以用户的角度)各node也是不会进行通信的,那各node节点唯一发生的通信的map和reduce中间的shuffle过程,此时通信也是隐式的,由于key的存在,便知道目的节点,所有的数据传送操作都是Hadoop平台去做的,对用户是透明的。
TaskTracker 向 JobTracker 报告任务运行情况
JobTracker 向 TaskTracker 分配任务 监视任务运行情况
DataNode 向 NameNode 请求data meat-data 和 更新自己的data meat-data change
DataNode 向 DataNode 请求data
那么什么是speculative execution呢?可能由于部分节点 I/O CPU 网络带宽的限制,部分任务运行慢,然而大部分作业已经完成,那么为了不让这些运行节点称为任务的瓶颈,hadoop会在几个空闲的节点上调度执行剩余任务的拷贝,其中某一个任务完成时便向JobTracker报告,首先完成的拷贝称为权威拷贝,其他任务放弃执行,其输出也会被放弃。reducer 则从权威拷贝获取所需数据或者将数据接入到结果文件。mapred.map.tasks.speculative.execution 可以设置禁止任务的推测性执行。
计算资源:
1. 处理器时间
2. 内存
3. 磁盘
4. 网络带宽
对于Hadoop来说, 磁盘,网络带宽可能是个瓶颈。