【发布时间】:2014-01-03 20:47:32
【问题描述】:
我决定编写一个简单的自定义 FileInputFormat 来测试我对 inputSplits 等的理解。这个练习给我留下了一个严肃的问题。
上下文
- 假设我有一个非常大的文件存储在 HDFS 中 N 个区块。
- 假设我的拆分可能跨越两个块(我已经知道为什么这不是一个好主意 - 我只是想提高我对 HDFS 和
InputSplits的理解 - 所以坚持下去)。 - 假设我有一个方法,它接受
FileStatus, FileSystem并返回一个FileInputSplit数组:
InputSplit[] getSplits(FileStatus file, FileSystem fs);
问题/问题
我需要 4 个值来形成 FileInputSplit split = new FileInputSplit(path, start, length, hosts)
我有路径、开始、长度,我需要获取主机,所以对于start 和length 指定的文件的每个部分,我检索位置块final BlockLocation[] blocks = fs.getBlockLocations(file, start, length); 并从块中我可以得到主机。
如果我感兴趣的部分跨越多个块,我不确定我需要做什么:
- 在形成 FileInputSplit 时,我是否使用来自
blocks[i]的offset, length - 如何将两个块塞进一个 inputSplit?
- 有combineInputSplit 和compositeInputSplit 但不确定是不是为了这个目的?
我的猜测
我猜这没关系,我猜我可以使用文件的开始、长度,并且只需附加一个包含多个块的所有主机的列表。由于记录阅读器将只使用文件系统来读取文件。所有可能发生的情况是 mapper-task 可能需要从不同的节点或机架读取块。
【问题讨论】: