hadoop如何创建跨越多个块的inputsplit

hadoop如何创建跨越多个块的inputsplit,hadoop,mapreduce,hdfs,Hadoop,Mapreduce,Hdfs,我决定编写一个简单的自定义FileInputFormat来测试我对inputSplits等的理解,这个练习给我留下了一个严肃的问题 上下文 假设我有一个非常大的文件,它存储在HDFS中 N个街区 假设我的拆分可能跨越两个块(我已经知道为什么这不是一个好主意-我只是想提高我对HDFS和输入拆分的理解-所以请坚持下去 假设我有一个方法,它接受一个FileStatus,FileSystem,并返回一个FileInputSplit数组: InputSplit[]getSplits(文件状态文件,文件

我决定编写一个简单的自定义FileInputFormat来测试我对inputSplits等的理解,这个练习给我留下了一个严肃的问题

上下文

  • 假设我有一个非常大的文件,它存储在HDFS中 N个街区
  • 假设我的拆分可能跨越两个块(我已经知道为什么这不是一个好主意-我只是想提高我对HDFS和
    输入拆分的理解-所以请坚持下去
  • 假设我有一个方法,它接受一个
    FileStatus,FileSystem
    ,并返回一个
    FileInputSplit
    数组:
InputSplit[]getSplits(文件状态文件,文件系统fs)

问题/问题

我需要4个值来形成一个
FileInputSplit split=newfileInputSplit(路径、开始、长度、主机)

我有路径、开始、长度,我需要获取主机,因此对于由
start
length
指定的文件的每个部分,我检索位置块
final BlockLocation[]blocks=fs.getBlockLocations(文件、开始、长度)从块中我可以得到主机

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

  • 形成FileInputSplit时,我是否使用
    块[I]
  • 如何将两个块塞入一个inputSplit
  • 有combineInputSplit和compositeInputSplit,但不确定是否用于此目的
  • 我猜

    我猜这无关紧要,我猜我可以使用文件的开始、长度,然后只附加一个包含多个块的所有主机的列表。因为记录读取器将只使用文件系统来读取文件。所有可能发生的情况是,映射器任务可能需要从不同的节点或机架读取块。

    这里讨论的是您所指的场景