大体思路:
1 先查找各个单节点,找出依次满足最大分割、最小节点分割,最后剩余数据,进入第二步
2 查看单个机架, 找出依次满足最大分割、最小机架分割,最后剩余数据,进入第三步
3 查找所有机架剩余数据,找出满足最大分割,最后剩余数据(小于最大分割),进入4步
4 将剩下的数据做为一个数据块。
1).三个重要的属性:
- maxSplitSize:切片大小最大值。可通过属性 "mapreduce.input.fileinputformat.split.maxsize" 或 CombineFileInputFormat.setMaxInputSplitSize()方法进行设置【不设置,则所有输入只启动一个map任务】
- minSplitSizeNode:同一节点的数据块形成切片时,切片大小的最小值。可通过属性 "mapreduce.input.fileinputformat.split.minsize.per.node" 或 CombineFileInputFormat.setMinSplitSizeNode()方法进行设置
- minSplitSizeRack:同一机架的数据块形成切片时,切片大小的最小值。可通过属性 "mapreduce.input.fileinputformat.split.minsize.per.rack" 或 CombineFileInputFormat.setMinSplitSizeRack()方法进行设置
- 大小关系:maxSplitSize >= minSplitSizeNode >= minSplitSizeRack
2).切片的形成过程:
2.1. 不断迭代节点列表,逐个节点 (以数据块为单位) 形成切片(Local Split)
a. 如果maxSplitSize == 0,则整个节点上的Block数据形成一个切片
b. 如果maxSplitSize != 0,遍历并累加每个节点上的数据块,如果累加数据块大小 >= maxSplitSize,则将这些数据块形成一个切片。继续该过程,直到剩余数据块累加大小 < maxSplitSize 。则进行下一步
c. 如果剩余数据块累加大小 >= minSplitSizeNode,则将这些剩余数据块形成一个切片。继续该过程,直到剩余数据块累加大小 < minSplitSizeNode。然后进行下一步,并这些数据块留待后续处理
2.2. 不断迭代机架列表,逐个机架 (以数据块为单位) 形成切片(Rack Split)
a. 遍历并累加这个机架上所有节点的数据块 (这些数据块即上一步遗留下来的数据块),如果累加数据块大小 >= maxSplitSize,则将这些数据块形成一个切片。继续该过程,直到剩余数据块累加大小<maxSplitSize。则进行下一步
b. 如果剩余数据块累加大小 >= minSplitSizeRack,则将这些剩余数据块形成一个切片。如果剩余数据块累加大小 < minSplitSizeRack,则这些数据块留待后续处理
2.3. 遍历并累加所有Rack上的剩余数据块,如果累加数据块大小 >= maxSplitSize,则将这些数据块形成一个切片。继续该过程,直到剩余数据块累加大小< maxSplitSize。则进行下一步
2.4. 将最终剩余的数据块形成一个切片。
Demo:
规定:maxSplit=100 > minSizeNode=50 > minSizeRack=30
原有文件:Rack01:{[30,60,70] [80,110]} Rack02:{170}
处理过程:
30+60+70 > 100 ? 100+60 80+110 > 100 ? 100+90 170 > 100 ? 100+70
---> 3个数据切片,以及Rack01:{[60] [90]} Rack02:{70}
---> 60 > 50 ? 50+10 90 > 50 ? 50+40 70 > 50 ? 50+20
---> 3+3个数据切片,以及Rack01:{[10] [40]} Rack02:{20}
---> 10+40 < 100 ?0 20 < 100 ? 0
---> 3+3+0个数据切片,以及Rack01:{50} Rack02:{20}
---> 50+20 > 30 ? 30+30+10
---> 3+3+0+3个数据切片