3

如果是,HDFS 如何将输入文件拆分为 N 行以供每个映射器读取?

我相信这是不可能的!

当拆分器需要偏移量或字节进行拆分时,可以在不处理整个输入文件的情况下进行拆分。

但是当 '\n' 或换行字符的数量很重要时,在拆分之前需要处理整个输入文件(以计算换行字符)。

4

2 回答 2

4

为了NLineInputFormat工作,每个拆分都需要知道第 x 行从哪里开始。正如您在对 Tariq 答案的评论中指出的那样,映射器不能只知道第 3 行(香蕉从哪里开始),它会从 Map 的InputSplit.

这实际上在输入格式的getSplitsForFile方法中得到了处理,该方法打开每个输入文件,并发现每 N 行开始的字节偏移量(并生成InputSplit要由 Map 任务处理的)。

正如您可以想象的那样,这对于大型输入文件(或大量输入文件)不能很好地扩展,因为InputFormat需要打开并读取每个文件以发现拆分边界。

我自己从来没有使用过这种输入格式,但我想它可能是最好的,当你需要为一个小输入文件中的每一行做大量 CPU 密集型工作时——而不是 1 个映射器为 100 条记录完成所有工作文件,您可以在许多映射器之间划分负载(例如 10 个映射器中的 10 行)。

于 2013-09-28T13:51:36.787 回答
0

是的。

这是可能的!

原因 :

该机制仍然相同,并且适用于原始数据。NLineInputFormat中的N代表的是每个mapper接收到的输入行数。准确地说,记录数。因为, NLineInputFormat 使用LineRecordReader,每一行都是一个记录。它不会改变创建拆分的方式,这通常基于 HDFS 块的大小(请记住 NLineInputFormat 是 FileInputFormat 系列的成员)。

于 2013-09-26T23:14:00.190 回答