2013-07-22 2 views
0

전체 파일에서 1부터 시작하는 시퀀스 번호를 생성해야하는 곳에 문제가 있습니다. 예를 들어Map Reduce를 사용하여 일련 번호 생성

다음과 같이 나는 BIG 파일을 가지고 있다고 할 수 있습니다 : -

ABC, 123
ABB, 111
CCC,

지금 같은 라인의 122
..... N 번호 내 출력은 다음과 같아야합니다 : -

1, abc, 123
2, abb, 111
3, ccc, 122
.... 등등.

mapreduce를 사용하여이 작업을 수행하는 문제는 파일의 모든 분할이 시퀀스를 유지할 수 없기 때문에 다른 맵 기능에 의해 병렬로 처리된다는 것입니다. 이 작업을 위해 단일 감속기를 사용하라고 말하지 마십시오. 나는 전형적인 mapreduce 작업을 사용하여 이것을 병렬로 수행하기를 원하기 때문에 단일 감속기를 사용하고 싶지 않다. 이것이 map-reduce를 사용하여 수행 할 수 있도록 최선의 방법이 있습니까?

+2

이 유용해야한다 : 참조 : 파이썬 (하둡 스트리밍)를 사용하여 위의 알고리즘

샘플 코드 http://blog.data-miners.com/2009/11/hadoop-and-mapreduce -parallel-program.html – Amar

+0

주문을 유지해야합니까? – twid

+0

예, 유지 관리 명령이 필요합니다. – Binary01

답변

0

이렇게 할 수는 있지만 약간 까다 롭습니다. 감속기의 작업 ID를 제공하는 "mapred_job_id"환경 변수로 작업해야합니다.

예를 들어, "mapred_job_id"변수를 읽을 때 "job_201302272236_0001"과 같은 내용이 표시 될 수 있습니다. 해당 작업 ID의 마지막 부분 인 "0001"을 사용할 수 있습니다.

이것을 사용하면 감속기가 출력하는 각 줄에 접두사를 만들 수 있습니다. 예를 들어 각 감속기가 최대 1000 개의 라인을 출력하는 것을 알고 있다면이 감속기의 출력을 1000-1999로 할 수 있습니다. 두 번째 감속기는 작업 ID가 "job_201302272236_0002"이므로 2000-2999가 걸립니다.

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 
관련 문제