如果是,HDFS 如何将输入文件拆分为 N 行以供每个映射器读取?
我相信这是不可能的!
当拆分器需要偏移量或字节进行拆分时,可以在不处理整个输入文件的情况下进行拆分。
但是当 '\n' 或换行符的数量很重要时,在拆分之前有必要处理总输入文件(以计算换行符)。
最佳答案
要使 NLineInputFormat
正常工作,每个拆分都需要知道第 x N 行的起始位置。正如您在对 Tariq 的回答的评论中指出的那样,映射器不能只知道第 3 行(香蕉从哪里开始),它会从 map 的 InputSplit
获取此信息。
这实际上是在输入格式的 getSplitsForFile
方法中处理的,它打开每个输入文件,并发现每个第 N 行开始的字节偏移量(并生成一个 InputSplit
由 Map 任务处理)。
正如您所想象的,这对于大型输入文件(或大量输入文件)来说并不能很好地扩展,因为 InputFormat
需要打开并读取每个文件以发现拆分边界。
我自己从未使用过这种输入格式,但我想当您需要为一个较小的输入文件中的每一行执行大量 CPU 密集型工作时,它可能最适合使用 - 因此而不是 1 个映射器完成所有工作一个 100 条记录的文件,您可以跨多个映射器划分负载(比如 10 个映射器上的 10 行)。
关于java - Hadoop:当我们使用 NLineInputFormat 时,Mappers 是否并行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19039603/