我决定编写一个简单的自定义fileinputformat来测试我对InputSplit等的理解,这个练习给我留下了一个严肃的问题。
上下文
假设我有一个非常大的文件,它跨n个块存储在hdfs中。
假设我的分割可能跨越两个块(我已经知道为什么这不是一个好主意-我只是想提高我对hdfs和 InputSplits
-所以坚持住)。
假设我有一个方法 FileStatus, FileSystem
并返回 FileInputSplit
:
inputsplit[]getsplits(文件状态文件,文件系统fs);
问题
我需要4个值来形成一个 FileInputSplit split = new FileInputSplit(path, start, length, hosts)
我有路径,开始,长度,我需要得到主机,所以对于文件的每一节都由 start
以及 length
我检索定位块 final BlockLocation[] blocks = fs.getBlockLocations(file, start, length);
从这些街区我可以找到主人。
如果我感兴趣的部分跨越多个街区,我不确定我需要做什么:
形成fileinputsplit时,是否使用 offset, length
从 blocks[i]
如何将两个块塞进一个inputsplit?
有combineinputsplit和compositeinputsplit,但不确定是否用于此目的?
我猜
我猜这无关紧要,我猜我可以使用文件的开始,长度,只是附加一个列表的所有主机有多个块。因为记录读取器只会使用文件系统来读取文件。所有可能发生的情况是,mapper任务可能需要从不同的节点或机架读取块。
1条答案
按热度按时间efzxgjgh1#
这个jira谈到了你所指的场景。