我决定编写一个简单的自定义FileInputFormat来测试我对inputSplits等的理解。此练习使我面临一个严重的问题。

上下文

  • 比方说,我有一个很大的文件存储在HDFS中
    N个区块。
  • 假设我的拆分可能跨越了两个块(,我已经知道为什么这不是一个好主意-我只是想提高我对HDFS和InputSplits的理解-因此请保留在中)。
  • 假设我有一个采用FileStatus, FileSystem并返回FileInputSplit数组的方法:

  • InputSplit [] getSplits(FileStatus file,FileSystem fs);

    问题/问题

    我需要4个值来形成FileInputSplit split = new FileInputSplit(path, start, length, hosts)
    我有路径,开始,长度,我需要获取主机,因此对于startlength指定的文件的每个部分,我都获取位置块final BlockLocation[] blocks = fs.getBlockLocations(file, start, length);,然后从这些块中获取主机。

    如果我感兴趣的部分跨越多个块,我不确定该怎么做:

    形成FileInputSplit时的
  • 我是否使用offset, length中的blocks[i]
  • 如何将两个块塞入一个inputSplit?
  • 有一个CombineInputSplit和CompositeInputSplit,但不确定是否为此目的吗?

  • 我的猜测

    我猜这没关系,我猜我可以使用文件的开始,长度,并仅附加具有多个块的所有主机的列表。由于记录读取器将仅使用fileSystem来读取文件。可能发生的所有事情是,映射器任务可能需要从其他节点或机架读取块。

    最佳答案

    Jira讨论您所指的场景。

    10-07 23:47