3

我编写了一个 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

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

./elastic-mapreduce -j $JOBID --ssh "hadoop fs -cp /XXX s3://bucket-id/XXX-output"
./elastic-mapreduce -j $JOBID --terminate

所以虽然这种方法有效,但它很笨重,不是我想要的。有没有更清洁的方法来做到这一点?

谢谢!

4

2 回答 2

9

您可以使用distcpwhich 将文件复制为 mapreduce 作业

# 从 s3 下载
$ hadoop distcp s3://bucket/path/on/s3/ /target/path/on/hdfs/
# 上传到 s3
$ hadoop distcp /source/path/on/hdfs/ s3://bucket/path/on/s3/

这会利用整个集群从 s3 并行复制。

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

于 2011-10-12T18:18:16.320 回答
0

@mat-kelcey,命令 distcp 是否期望 S3 中的文件具有最低权限级别?出于某种原因,我必须将文件的权限级别设置为“每个人”的“打开/下载”和“查看权限”,以便能够从引导程序或步骤脚本中访问这些文件。

于 2014-04-16T16:28:50.243 回答