6

我正在尝试使用 EMR 中的工作流将文件从 s3 复制到 hdfs,当我运行以下命令时,作业流成功启动,但在尝试将文件复制到 HDFS 时出现错误。我需要设置任何输入文件权限吗?

命令:

./elastic-mapreduce --jobflow j-35D6JOYEDCELA --jar s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar --args '--src,s3://odsh /input/,--dest,hdfs:///用户

输出

任务 TASKID="task_201301310606_0001_r_000000" TASK_TYPE="REDUCE" TASK_STATUS="FAILED" FINISH_TIME="1359612576612" ERROR="java.lang.RuntimeException: Reducer 任务无法复制 1 个文件:s3://odsh/input/GL_01112_20121019.dat 等在 com.amazon.external.elasticmapreduce.s3distcp.CopyFilesReducer.close(CopyFilesReducer.java:70) 在 org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:538) 在 org.apache.hadoop.mapred.ReduceTask .run(ReduceTask.java:429) at org.apache.hadoop.mapred.Child$4.run(Child.java:255) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject。 doAs(Subject.java:396) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1132) at org.apache.hadoop.mapred.Child.main(Child.java:249)

4

4 回答 4

6

我得到了同样的例外。看起来该错误是由CopyFilesReducer使用多个CopyFilesRunable实例从 S3 下载文件时的竞争条件引起的。问题是它在多个线程中使用相同的临时目录,并且线程在完成后会删除临时目录。因此,当一个线程在另一个线程之前完成时,它会删除另一个线程仍在使用的临时目录。

我已经向 AWS 报告了这个问题,但与此同时,您可以通过s3DistCp.copyfiles.mapper.numWorkers在作业配置中将变量设置为 1 来强制减速器使用单个线程来解决该错误。

于 2013-11-04T22:11:05.780 回答
2

调整工人数量对我不起作用;s3distcp 在小型/中型实例上总是失败。增加任务作业的堆大小(通过-D mapred.child.java.opts=-Xmx1024m)为我解决了这个问题。

示例用法:

hadoop jar /home/hadoop/lib/emr-s3distcp-1.0.jar 
    -D mapred.child.java.opts=-Xmx1024m 
    --src s3://source/
    --dest hdfs:///dest/ --targetSize 128
    --groupBy '.*\.([0-9]+-[0-9]+-[0-9]+)-[0-9]+\..*' 
    --outputCodec gzip
于 2014-10-02T04:44:23.293 回答
2

我看到了由竞争条件引起的同样问题。通过-Ds3DistCp.copyfiles.mapper.numWorkers=1有助于避免问题。

我希望亚马逊能修复这个错误。

于 2014-07-12T22:17:06.830 回答
2

问题是地图 - 减少作业失败。Mapper 执行完美,但 reducer 在集群内存中创建了一个瓶颈。

这为我解决了-Dmapreduce.job.reduces=30如果它仍然失败尝试

将其减少到 20 即-Dmapreduce.job.reduces=20

为了便于理解,我将添加整个论点:

在 AWS 集群中:

JAR 位置:command-runner.jar

主要课程:无

参数:s3-dist-cp -Dmapreduce.job.reduces=30 --src=hdfs:///user/ec2-user/riskmodel-output --dest=s3://dev-quant-risk-model/2019_03_30_SOM_EZ_23Factors_Constrained_CSR_Stats /输出--multipartUploadChunkSize=1000

对失败采取的行动:继续

在脚本文件中:

aws --profile $AWS_PROFILE emr add-steps --cluster-id $CLUSTER_ID --steps Type=CUSTOM_JAR,Jar='command-runner.jar',Name="Copy Model Output To S3",ActionOnFailure=CONTINUE,Args= [s3-dist-cp,-Dmapreduce.job.reduces=20,--src=$OUTPUT_BUCKET,--dest=$S3_OUTPUT_LARGEBUCKET,--multipartUploadChunkSize=1000]

于 2019-04-01T08:06:48.560 回答