2013-08-27 5 views
0

I는 라인으로 큰 파일의 라인을 판독하고, 각 행에서의 동작을 수행하고 출력 인쇄 다음 간단한 mrjob 스크립트 가지고hadoop 러너 만드는 법?

#!/usr/bin/env python                           

from mrjob.job import MRJob 

class LineProcessor(MRJob): 
    def mapper(self, _, line): 
     yield (line.upper(), None) # toy example: mapper just uppercase the line 

if __name__ == '__main__': 
    # mr_job = LineProcessor(args=['-r', 'hadoop', '/path/to/input']) # error! 
    mr_job = LineProcessor(args=['/path/to/input']) 
    with mr_job.make_runner() as runner: 
     runner.run() 
     for line in runner.stream_output(): 
      key, value = mr_job.parse_output_line(line) 
      print key.encode('utf-8') # don't care about value in my case 

(이것은 단지 장난감 예이며, 각 라인의 처리가 비싸다 내 실제 경우에는 배포를 원한다.)

로컬 프로세스로만 작동합니다. 내가 '-r', 'hadoop'를 사용하려고하면 (주석 참조 위) I 얻을 다음과 같은 이상한 오류 :

File "mrjob/runner.py", line 727, in _get_steps 
    'error getting step information: %s', stderr) 
Exception: ('error getting step information: %s', 'Traceback (most recent call last):\n File "script.py", line 11, in <module>\n with mr_job.make_runner() as runner:\n File "mrjob/job.py", line 515, in make_runner\n " __main__, which doesn\'t work." % w)\nmrjob.job.UsageError: make_runner() was called with --steps. This probably means you tried to use it from __main__, which doesn\'t work.\n') 

가 어떻게 실제로 즉 HadoopJobRunner를 작성, 하둡에서 실행할 수 있습니다?

+0

Hadoop Streaming 작업으로 실행하지 않는 이유가 있습니까? 예 : http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/ –

+0

링크를 제공해 주셔서 감사합니다. 나는 편의성과 단순성을 위해 주로 mrjob을 선호합니다. hdfs와 데이터를 수동으로 복사하고 싶지 않습니다. 출력 형식을 쉽게 제어 할 수 있기를 원합니다. 하나의 파이썬 스크립트로 모든 것을 원합니다. 로컬 (테스트 용)과 hadoop에서 실행하는 것을 쉽게 전환하고 싶습니다. – Frank

+0

프랭크 문제가 내 것과 똑같습니다. 나는 hadoop sanboxes/clusters/emr/(azure?)의 다른 유형에 대한 주자를 구성하는 방법을 이해하려고합니다. 당신은 당신의 연구와 함께 더있어? – Enzo

답변

0

당신은 당신의 LineProcessor에

def steps(self): 
     return [self.mr(
          mapper_init = ... 
          mapper = self.mapper, 
          combiner = ..., 
          reducer = ..., 
       )] 

누락?