在hadoop中,映射器接收密钥作为文件中的位置,如“0,23,45,76,123”,我认为这是字节偏移。
我有两个大的输入文件,我需要以一种方式进行拆分,其中文件的相同区域(就行数而言,例如400行)获得相同的密钥。字节偏移显然不是最佳选择。
我想知道是否有方法或选项将键更改为整数,因此输出键将为:“1,2,3,4,5”而不是“0,23,45,76,123 “?
谢谢!
答案 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中使用它。 这种方式可以使用完全并行的记录索引。