将数据输入和输出Elastic MapReduce HDFS

ron*_*nre 3 hadoop elastic-map-reduce

我编写了一个Hadoop程序,它需要HDFS中的某个布局,之后,我需要从HDFS中获取文件.它适用于我的单节点Hadoop设置,我很想让它在Elastic MapReduce中的10个节点上工作.

我一直在做的是这样的:

./elastic-mapreduce --create --alive
JOBID="j-XXX" # output from creation
./elastic-mapreduce -j $JOBID --ssh "hadoop fs -cp s3://bucket-id/XXX /XXX"
./elastic-mapreduce -j $JOBID --jar s3://bucket-id/jars/hdeploy.jar --main-class com.ranjan.HadoopMain --arg /XXX
Run Code Online (Sandbox Code Playgroud)

这是异步的,但是当作业完成后,我可以这样做

./elastic-mapreduce -j $JOBID --ssh "hadoop fs -cp /XXX s3://bucket-id/XXX-output"
./elastic-mapreduce -j $JOBID --terminate
Run Code Online (Sandbox Code Playgroud)

所以虽然这种方式有效,但它很笨重,而不是我想要的.有更清洁的方法吗?

谢谢!

mat*_*cey 9

您可以使用distcp哪个将文件复制为mapreduce作业

# download from s3
$ hadoop distcp s3://bucket/path/on/s3/ /target/path/on/hdfs/
# upload to s3
$ hadoop distcp /source/path/on/hdfs/ s3://bucket/path/on/s3/

这使得整个群集可以从s3并行复制.

(注意:每个路径上的尾部斜杠对于从目录复制到目录很重要)

  • 我最终做的是使用EMR运行存储在S3上的脚本的能力:elastic-mapreduce -j $ JOB_ID --jar s3://elasticmapreduce/libs/script-runner/script-runner.jar --args"$ { S3_BUCKET} /scripts/copy_to_hdfs.sh, ..."其中copy_to_hdfs.sh是一个bash脚本,它执行:hadoop fs -cp [...]控制流仍然看起来有点复杂,但它能够无人值守运行. (2认同)