如果是,HDFS 如何将输入文件拆分为 N 行以供每个映射器读取?
我相信这是不可能的!
当拆分器需要偏移量或字节进行拆分时,可以在不处理整个输入文件的情况下进行拆分。
但是当 '\n' 或换行字符的数量很重要时,在拆分之前需要处理整个输入文件(以计算换行字符)。
为了NLineInputFormat
工作,每个拆分都需要知道第 x 行从哪里开始。正如您在对 Tariq 答案的评论中指出的那样,映射器不能只知道第 3 行(香蕉从哪里开始),它会从 Map 的InputSplit
.
这实际上在输入格式的getSplitsForFile
方法中得到了处理,该方法打开每个输入文件,并发现每 N 行开始的字节偏移量(并生成InputSplit
要由 Map 任务处理的)。
正如您可以想象的那样,这对于大型输入文件(或大量输入文件)不能很好地扩展,因为InputFormat
需要打开并读取每个文件以发现拆分边界。
我自己从来没有使用过这种输入格式,但我想它可能是最好的,当你需要为一个小输入文件中的每一行做大量 CPU 密集型工作时——而不是 1 个映射器为 100 条记录完成所有工作文件,您可以在许多映射器之间划分负载(例如 10 个映射器中的 10 行)。
是的。
这是可能的!
原因 :
该机制仍然相同,并且适用于原始数据。NLineInputFormat中的N代表的是每个mapper接收到的输入行数。准确地说,记录数。因为, NLineInputFormat 使用LineRecordReader,每一行都是一个记录。它不会改变创建拆分的方式,这通常基于 HDFS 块的大小(请记住 NLineInputFormat 是 FileInputFormat 系列的成员)。