使用Map Reduce生成序列号

时间:2013-07-22 13:56:31

标签: hadoop mapreduce

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

前言我说我有一个 BIG 文件如下: -

abc,123
abb,111
ccc,122
...... N个这样的行

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

使用此方法,您可以为reducer输出的每一行构造一个前缀。例如,如果您知道每个减速器最多输出1000行,则可以将此减速器的输出设置为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