1

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

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

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

谢谢!

4

3 回答 3

0

In hadoop, the mapper receives the key as the position in the file like "0, 23, 45, 76, 123", which I think are byte offsets.

Yes. But not always. It is true if you are using TextInputFormat(as in your case). Keys and values depend on the type of InputFormat you are using and change accordingly.

I was wondering if there is a way or option to change the keys to an integer so the output keys will be: "1, 2, 3, 4, 5" instead of "0, 23, 45, 76, 123"?

You can write your own custom InputFormat by subclassing FileInputFormat to achieve this.

于 2013-07-24T15:46:35.020 回答
0

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

protected int recNo = 0;

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

    // mapper implementation
    // ...
}

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

于 2013-07-25T00:16:07.240 回答
0

这是可能的,如果我做得对,那么您想按增量顺序索引所有记录。

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

ActualIndex = splitNubmer * Num_Of_record_Per_Split + record_Offset

现在将详细介绍。首先创建带有NLineInputFormat的拆分,它允许在特定拆分中索引记录。使用键作为 Emmit 记录splitId + redordIndex in split + actual record。现在我们已经在 Map 阶段索引了拆分。然后,您需要使用 custom来按in 键对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中使用它。这种方式使用可以使用完全并行的记录索引。

于 2013-07-25T06:13:16.320 回答