让我们考虑一个mapreduce作业,它生成1000个map任务。块大小:128mb最小拆分大小:1mb最大拆分大小:256mb
块大小似乎是限制值。我们能把分割的大小增加到块的大小以外吗?
这是fileinputformat.java中的函数
protected long computeSplitSize(long goalSize, long minSize, long blockSize) {
return Math.max(minSize, Math.min(goalSize, blockSize));
}
基于以上函数最小分割大小大于块大小将做我想要的。有人能解释一下这样设置最小分割大小的副作用吗?
1条答案
按热度按时间rjee0c151#
为此你必须明白
goalSize
指总输入大小除以JobConf.getNumMapTasks()
. 这个计算意味着:分割将不小于文件或文件中的剩余数据
minSize
.一个分裂将不大于二者中的较小者
goalSize
以及blockSize
.有鉴于此,您可以理解理想的分割大小正好是1块大小,因为它允许框架为处理分割的任务提供数据局部性(图片来源:pro hadoop)
如果要将分割大小增加到块大小之外,这意味着每个Map器都需要执行远程读取来读取非本地的数据,因此这可能会降低效率。但是,除非你试图制造巨大的分裂,我怀疑这将有一个关键的性能影响。我仍然建议尽可能保持默认的拆分大小,除非您有一个可靠的用例,这样做行不通。