我们可以为FileInputFormat自定义InputSplit大小

时间:2013-02-08 22:00:42

标签: java hadoop mapreduce

让我们考虑一个产生1000个地图任务的MapReduce作业。 块大小:128MB 最小分割大小:1MB 最大分割大小:256MB

块大小似乎是限制值。我们可以将分割大小增加到块大小以外吗?

这是来自FileInputFormat.java的函数

protected long computeSplitSize(long goalSize, long minSize, long blockSize) {
    return Math.max(minSize, Math.min(goalSize, blockSize));
}

基于上面的函数,最大分割大小大于块大小将做我想要的。有人可以通过这种方式对设置最小分割尺寸的任何副作用有所了解吗?

1 个答案:

答案 0 :(得分:0)

为此,您必须了解goalSize是指总输入大小除以JobConf.getNumMapTasks()。这个计算意味着:

  • 拆分不会小于文件中的剩余数据或minSize
  • 分割不会大于goalSizeblockSize中的较小者。

有了这个,您可以理解理想的分割大小恰好是1个块大小,因为它允许框架为处理分割的任务提供数据局部性。 (来源:Pro Hadoop

如果要将分割大小增加到块大小之外,这意味着每个映射器都需要进行远程读取以读取非本地数据,因此效率可能会降低。但除非你试图创造巨大的分裂,否则我怀疑这会对性能产生重大影响。我仍然建议尽可能保持默认的分割大小,除非你有一个坚实的用例,这将无法工作。