hadoop对键进行排序并更改键值

时间:2013-07-24 13:49:01

标签: hadoop mapreduce

在hadoop中,映射器接收密钥作为文件中的位置,如“0,23,45,76,123”,我认为这是字节偏移。

我有两个大的输入文件,我需要以一种方式进行拆分,其中文件的相同区域(就行数而言,例如400行)获得相同的密钥。字节偏移显然不是最佳选择。

我想知道是否有方法或选项将键更改为整数,因此输出键将为:“1,2,3,4,5”而不是“0,23,45,76,123 “?

谢谢!

3 个答案:

答案 0 :(得分:0)

  

在hadoop中,映射器接收密钥作为文件中的位置   比如“0,23,45,76,123”,我认为这是字节偏移。

是。但不总是。如果您使用TextInputFormat(如您的情况),则确实如此。键和值取决于您使用的InputFormat的类型并相应地更改。

  

我想知道是否有办法或选项将密钥更改为   整数所以输出键将是:“1,2,3,4,5”而不是“0,23,   45,76,123“?

您可以通过继承FileInputFormat来编写自己的自定义InputFormat来实现此目的。

答案 1 :(得分:0)

您可以在映射器中自行跟踪行号:

protected int recNo = 0;

protected void map(LongWritable key, Text value, Context context) {
    ++recNo;

    // mapper implementation
    // ...
}

但这并不考虑可拆分文件(一个存储在2个或更多块中并且可拆分的文件 - 例如,不使用gzip压缩)。在这种情况下,每个拆分将使用1的行号进行编号,而不是从文件开头的行号进行编号。你提到你有两个大文件 - 所以要么你需要强制输入格式的最小分割大小大于文件的大小,要么使用不可分割的压缩编解码器压缩你的文件(强制每个文件处理单个任务)作为gzip。

答案 2 :(得分:0)

这是可能的,如果我正确,那么你想要按增量顺序索引所有记录。

我做到了。您可以利用框架。这是我们在GPU中编程的方式。 概述您可以在拆分文件中拆分,每行记录相同的数量。这将允许您索引特定索引。   文件拆分后的公式是

ActualIndex = splitNubmer * Num_Of_record_Per_Split + record_Offset

现在将详细介绍。   首先使用NLineInputFormat创建拆分,这允许索引特定拆分的记录。密钥为splitId + redordIndex in split + actual record的Emmit记录。现在我们已经在Map阶段中对分割进行了索引。   然后,您需要使用自定义SortComaprator,在密钥中按SplitId对中间输出进行排序。然后装扮groupComarator,将所有键分组为SplitId。   现在在减速机中你可以使用上面的公式。索引记录。   但问题是我们如何按升序识别splitNumber。我解决了这个问题。   Hadoop按file_HDFS_URL/file_name:StartOffset+Length

拆分文件
 example: hdfs://server:8020/file.txt:0+400, hdfs://server:8020/file.txt:400+700, and So on.

我在HDFS中创建了一个记录所有拆分startOffset的文件。然后在Reducer中使用它。  这种方式可以使用完全并行的记录索引。