3

EMR 出力を HDFS に書き込んでいる人々のを見ましたが、それがどのように行われたかの例を見つけることができませんでした。その上、このドキュメントでは、EMR ストリーミング ジョブの --output パラメータは S3 バケットでなければならないと言っているようです。

実際にスクリプトを実行しようとすると (この場合は Python ストリーミングと mrJob を使用)、「Invalid S3 URI」エラーがスローされます。

コマンドは次のとおりです。

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

そして、トレースバック...

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'

EMR ストリーミング ジョブの出力を HDFS に書き込むにはどうすればよいですか? それは可能ですか?

4

3 に答える 3

1

mrJob を使用してどのように実行できるかはわかりませんが、Java で記述された Hadoop およびストリーミング ジョブでは、次のように実行します。

  1. クラスターを起動する
  2. s3distcpを使用して s3 からクラスターの HDFS にデータを取得します。
  3. 入力を HDFS としてジョブのステップ 1 を実行します。
  4. 上記と同じ入力でステップ2または私たちのジョブを実行します...

EMR CLIを使用して、次のように実行します。

> 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"
于 2013-05-30T20:36:01.997 に答える
0

ジョブが完了した後、EMR クラスターは正常に保持されないため、S3 バケットである必要があります。したがって、出力を永続化する唯一の方法はクラスターの外であり、次に近い場所は S3 です。

于 2013-05-25T00:15:48.227 に答える