MapTask以及数据块和数据切片
MapTask
MapTask指的是在MapReduce运行过程中为每一个数据切片分配的数据运算实例任务。MapTask的并行度也就指的是运算任务实例的数量,影响整个job的处理速度。
MapTask 并行度决定机制
数据块:Block
是 HDFS
物理上把数据分成一块一块,数据块是 HDFS 存储数据单位
数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask。
提示
对于一个要处理的文件数据,Map框架有默认的切片大小,一般默认为blocksize
的大小,在分配MapTask运算任务实例的时候对每一个数据切片分配一个MapTask,这样的话若一个文件的大小没有达到blocksize
的大小的时候(比如说文件大小只有1k),那当然就会为了减少资源浪费默认分配一个MapTask。
- 一个job的Map阶段有客户端在提交job时的切片数决定。
- 每一个数据切片分配一个MapTask实例处理。
- 默认情况下切片大小默认为
blocksize
。
(如果说不是blocksize
的话,与DataNode中存储的数据块大小不相符,那么在MapTask阶段,就需要进行DataNode之间的数据传输,大大增加了io操作耗费的时间。) - 切片时不考虑数据集整体,而是逐个针对每一个文件进行单独切片。
MapTask 切片大小示例
例如现在有个300MB大小的文件,现在要对它进行数据切片。理论上来说,给它三等分,每份100MB比较合理,但是事实上是这样吗?
默认数据块大小是128MB,所以这个300MB大小的文件很有可能被切块后保存在三个不同的服务器上。他们的大小分别是 0-128MB、128-256MB、256-300MB
如果按照100MB大小,对这三个数据块进行切片,那么第一个数据块,也就是0-128MB的数据块就要被分成两部分,
其中第一份数据切片正常读取,第一个数据块中的0-100MB
第二片就要跨服务器读取。第一个数据块中的100-128MB的28MB数据,和第二个数据块中的128-200MB数据,这两个块里的部分数据组成一个数据切片。
第三片也要跨服务器读取。第二个数据块中的200-256MB的56MB数据,和第三个数据块中的全部44MB数据,这两个部分的数据组成一个数据切片
理论上合理的逻辑,在实际开发中涉及到了跨服务器通讯,导致效率降低。
所以这里最符合实际效果的切片大小,就是默认的128MB,也就是 数据块
的大小
提示
数据切片是 InputFormat
来做的,后面会说到这里
每一个切片都会有一个MapTask来执行