是否可以知道地图功能当前工作的输入数据块的序列号?

时间:2013-11-29 08:52:30

标签: hadoop

我是Hadoop的新手,在这里我有以下问题:

(1)据我所知,原始输入文件被分成几个块并通过网络分发。 map函数是否总是在块上执行?是否可以在一个块中对数据执行多个映射函数?

(2)是否有任何方法可以从map函数中学习映射器当前正在处理的原始输入文本的哪一部分?我希望从输入文本的第一个块开始为每个块获取类似序列号的内容。

(3)是否可以以每个块具有预定义字数的方式对输入文本进行拆分?如果可能的话怎么样?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

  1. 据我所知,原始输入文件被分成几个块并通过网络分发。 map函数是否总是在块上执行?是否可以在一个块中对数据执行多个映射函数?

    没有。一个块(精确地拆分)只由一个映射器处理。

  2. 有没有办法可以从map函数中学习映射器当前正在处理的原始输入文本的哪一部分?我希望从输入文本的第一个块开始为每个块获取类似序列号的内容。

    您可以获得一些有价值的信息,例如包含拆分数据的文件,要处理的文件中第一个字节的位置。等等,在 FileSplit 类的帮助下。您可能会觉得它很有帮助。

  3. 是否可以以每个块具有预定义字数的方式对输入文本进行拆分?如果可能的话怎么样?

    您可以通过扩展FileInputFormat课程来实现这一目标。首先,你可以这样做: 在你的getSplits()方法中维护一个计数器。现在,当您逐行读取文件时,请继续对其进行标记。收集每个标记并将计数器增加1.计数器达到所需值后,将读取的数据作为一个分割发出。重置计数器并从第二次拆分开始。

  4. HTH

答案 1 :(得分:0)

  1. 如果定义一个较小的最大分割大小,实际上可以有多个映射器处理单个HDFS块(比如32 MB块大小的32mb最大分割 - 你将得到4个映射器在同一个HDFS块上工作) 。使用标准输入格式,您通常不会看到两个或多个映射器处理块的相同部分(相同的记录)。

  2. MapContext.getInputSplit()通常可以转换为FileSplit,然后您正在处理文件的路径,偏移量和长度。

  3. 如果您的输入文件是真正的文本苍蝇,那么您可以使用Tariq建议的方法,但请注意,这对于较大的数据源非常低效,因为作业客户端必须处理每个输入文件以发现拆分位置(所以你最终阅读每个文件两次)。如果您真的只希望每个映射器处理一定数量的单词,您可以运行一个作业将文本文件重新格式化为序列文件(或其他格式),并将记录写入磁盘,每个单词具有固定数量的单词文件(使用多个输出来获取每个字数的文件,但这又是低效的)。也许如果你分享用例为什么你想要一个固定数量的单词,我们可以更好地了解你的需求并提出替代方案