2013-05-08 58 views
2

我看到examples的人寫EMR輸出到HDFS,但我一直沒能找到它如何完成的例子。最重要的是,this documentation似乎表示,EMR流作業的--output參數必須是是S3存儲桶。如何將EMR流作業的輸出寫入HDFS?

當我真的嘗試運行一個腳本(在這種情況下,使用python streaming和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' 

我如何寫電子病歷數據流作業,到HDFS的輸出?它甚至有可能嗎?

+0

這是一個老問題,但可能仍然活躍。通過查看MrJob來源,EMRJobRunner只接受輸出目的地的S3存儲桶。由於您使用的是「長壽命」集羣,因此可能會使用HadoopJobRunner('-r hadoop')來解決問題。儘管我無法實現工作解決方案... – 2016-03-03 14:09:12

回答

0

它必須是S3存儲桶,因爲在作業完成後EMR羣集不會正常保存。所以,堅持輸出的唯一方法是在集羣之外,下一個最接近的地方是S3。

+0

我在「保持活動」模式下運行作業流程,因此結果可以在作業流程步驟之間的HDFS中保留。我的作業結構需要使用相同的(大型)數據集作爲流程中許多步驟的輸入。如果數據存儲在HDFS中,而不是在每一步中從S3重新下載數據,這將節省大量時間。 – Abe 2013-05-25 20:24:44

+0

我明白了。我不是Python專家,但MRJobRunner(EMRJobRunner的超級代碼)代碼的代碼似乎表明,您不需要在輸出參數中指定'hdfs://',只需指定位置即可https://github.com /Yelp/mrjob/blob/master/mrjob/emr.py – kgu87 2013-05-25 20:49:24

1

我不知道它如何使用mrJob來完成,但與Hadoop和streaming jobs written in java,我們做如下:

  1. 啓動集羣
  2. 從獲取數據S3使用s3distcp到HDFS羣集
  3. 與輸入執行我們的工作的步驟1作爲HDFS
  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"