2013-05-08 3 views
2

사람들의 examples이 HDFS에 EMR 출력을 쓰는 것을 봅니다. 그러나 어떻게 완료되었는지 예제를 찾을 수 없었습니다. 무엇보다 this documentation은 EMR 스트리밍 작업 에 대한 --output 매개 변수가이 S3 버킷이어야한다고 말합니다.EMR 스트리밍 작업의 출력을 HDFS에 쓰려면 어떻게해야합니까?

실제로 스크립트 (이 경우 Python 스트리밍 및 mrJob 사용)를 실행하려고하면 "잘못된 S3 URI"오류가 발생합니다.

Traceback (most recent call last): 
    File "pipes/sampler.py", line 28, in <module> 
    SamplerJob.run() 
    File "/Library/Python/2.7/site-packages/mrjob/job.py", line 483, in run 
    mr_job.execute() 
    File "/Library/Python/2.7/site-packages/mrjob/job.py", line 501, in execute 
    super(MRJob, self).execute() 
    File "/Library/Python/2.7/site-packages/mrjob/launch.py", line 146, in execute 
    self.run_job() 
    File "/Library/Python/2.7/site-packages/mrjob/launch.py", line 206, in run_job 
    with self.make_runner() as runner: 
    File "/Library/Python/2.7/site-packages/mrjob/job.py", line 524, in make_runner 
    return super(MRJob, self).make_runner() 
    File "/Library/Python/2.7/site-packages/mrjob/launch.py", line 161, in make_runner 
    return EMRJobRunner(**self.emr_job_runner_kwargs()) 
    File "/Library/Python/2.7/site-packages/mrjob/emr.py", line 585, in __init__ 
    self._output_dir = self._check_and_fix_s3_dir(self._output_dir) 
    File "/Library/Python/2.7/site-packages/mrjob/emr.py", line 776, in _check_and_fix_s3_dir 
    raise ValueError('Invalid S3 URI: %r' % s3_uri) 
ValueError: Invalid S3 URI: 'hdfs:///input/sample' 

어떻게 HDFS에 EMR 스트리밍 작업의 출력을 쓸 수 있습니다 ...

python my_script.py -r emr \ 
--emr-job-flow-id=j-JOBID --conf-path=./mrjob.conf --no-output \ 
--output hdfs:///my-output \ 
hdfs:///my-input-directory/my-files*.gz 

그리고 역 추적 : 여기

명령입니까? 심지어 가능할까요?

+0

이것은 오래된 문제이지만 여전히 여전히 활성화되어 있습니다. MrJob 소스를 살펴보면 EMRJobRunner는 출력 대상에서 S3 버킷 만 허용합니다. "오래 살았던"클러스터를 사용하고 있기 때문에 HadoopJobRunner (* -r hadoop) 대신 *를 사용할 수 있습니다. 그래도 작업 솔루션을 얻을 수 없었습니다 ... –

답변

0

작업이 완료된 후 EMR 클러스터가 정상적으로 유지되지 않으므로 S3 버킷이어야합니다. 따라서 출력을 지속시키는 유일한 방법은 클러스터 외부이며 다음으로 가장 가까운 곳은 S3입니다.

+0

"keep-alive"모드에서 작업 흐름을 실행 중이므로 결과가 작업 흐름 단계 사이의 HDFS에서 지속될 수 있습니다. 내 작업의 구조는 동일한 (큰) 데이터 세트를 흐름의 많은 단계에 대한 입력으로 사용해야합니다. 데이터가 모든 단계에서 S3에서 다시 다운로드하는 대신 HDFS에 저장되는 경우 많은 시간을 절약 할 수 있습니다. – Abe

+0

나는 본다. 나는 파이썬 전문가는 아니지만 MRJobRunner (super of EMRJobRunner) 코드는 출력 매개 변수의 일부로 'hdfs : //'를 지정할 필요가 없다고 제안하는 것처럼 보입니다 (https://github.com). /Yelp/mrjob/blob/master/mrjob/emr.py – kgu87

1

나는 그것이 mrJob을 사용하여 수행 할 수있는 방법을 잘 모르겠지만, 다음과 같이 하둡과 streaming jobs written in java, 우리는 그것을 할 :

  1. 시작 클러스터를
  2. 의 HDFS에 s3distcp를 사용 S3에서 데이터를 가져옵니다 클러스터
  3. 는 ... HDFS
  4. 단계 2 상기와 같은 입력과의 작업을 실행 입력으로 우리의 작업의 1 단계를 실행
012 다음과 같이 3,516,

EMR CLI를 사용하여, 우리는 그것을 수행합니다 MRJob EMR 작업의 출력을 저장

> export jobflow=$(elastic-mapreduce --create --alive --plain-output 
> --master-instance-type m1.small --slave-instance-type m1.xlarge --num-instances 21 --name "Custer Name" --bootstrap-action s3://elasticmapreduce/bootstrap-actions/configure-hadoop --args 
> "--mapred-config-file,s3://myBucket/conf/custom-mapred-config-file.xml") 
> 
> 
> elastic-mapreduce -j $jobflow --jar 
> s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar 
> --arg --src --arg 's3://myBucket/input/' --arg --dest --arg 'hdfs:///input' 
> 
> elastic-mapreduce --jobflow $jobflow --jar s3://myBucket/bin/step1.jar 
> --arg hdfs:///input --arg hdfs:///output-step1 --step-name "Step 1" 
> 
> elastic-mapreduce --jobflow $jobflow --jar s3://myBucket/bin/step2.jar 
> --arg hdfs:///input,hdfs:///output-step1 --arg s3://myBucket/output/ --step-name "Step 2" 
관련 문제