0

我有一个问题,我需要在整个文件中从 1 开始生成序列号。

例如,假设我有一个文件,如下所示:-

abc,123
abb,111
ccc,122
.....N 行数

现在我的输出应该如下: -

1,abc,123
2,abb,111
3,ccc,122
....等等。

使用 mapreduce 执行此操作的问题是文件的每个拆分都由不同的 map 函数并行处理,因此无法维护序列。请不要告诉我使用单个减速器来执行此操作。我不想使用单个 reducer,因为我想使用典型的 mapreduce 作业并行执行此操作。那么有没有最好的方法可以使用 map-reduce 来完成呢?

4

1 回答 1

0

你可以做到这一点,但它有点棘手。您需要使用“mapred_job_id”环境变量,它为您提供减速器的作业 ID。

例如,当您读入“mapred_job_id”变量时,您可能会得到如下内容:“job_201302272236_0001”。您可以获取该作业 ID 的最后一部分,即“0001”。

使用它,您可以为减速器输出的每一行构造一个前缀。例如,如果你知道每个 reducer 最多输出 1000 行,你可以让这个 reducer 的输出为 1000-1999。第二个减速器的作业 ID 为“job_201302272236_0002”,因此需要 2000-2999。

使用 Python(Hadoop 流式传输)的上述算法的示例代码:

import os, sys
jobID = os.environ['mapred_job_id']
reducerID = jobID.split("_")[-1]

count = 0
for line in sys.stdin: 
  print str((reducerID*NUM)+count) + "," + line
  count += 1
于 2013-07-22T14:38:00.527 回答