【问题标题】:hadoop how do i create an inputsplit that spans multiple blockshadoop我如何创建一个跨越多个块的inputsplit
【发布时间】: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); 并从块中我可以得到主机。

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

  1. 在形成 FileInputSplit 时,我是否使用来自 blocks[i] 的 offset, length
  2. 如何将两个块塞进一个 inputSplit?
  3. 有combineInputSplit 和compositeInputSplit 但不确定是不是为了这个目的?

我的猜测

我猜这没关系,我猜我可以使用文件的开始、长度,并且只需附加一个包含多个块的所有主机的列表。由于记录阅读器将只使用文件系统来读取文件。所有可能发生的情况是 mapper-task 可能需要从不同的节点或机架读取块。

【问题讨论】:

    标签: hadoop mapreduce hdfs


    【解决方案1】:

    此Jira 谈论您所指的场景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 2021-10-10
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多