【问题标题】:copy files from amazon s3 to hdfs using s3distcp fails使用 s3distcp 将文件从 amazon s3 复制到 hdfs 失败
【发布时间】:2019-04-01 16:06:48
【问题描述】:

我正在尝试使用 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:///Users

输出

Task 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) 在 org.apache.hadoop.mapred.Child$4.run(Child.java:255) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:396) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1132) 在 org.apache.hadoop.mapred.Child.main(Child.java:249)

【问题讨论】:

    标签: hadoop amazon-s3 hdfs elastic-map-reduce


    【解决方案1】:

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

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

    【讨论】:

    • 有人知道亚马逊是否解决了这个问题吗?
    • 注意:确保在-Ds3 之间放置一个空格,并且还必须在foobar.jar 部分之后放置一个空格。
    【解决方案2】:

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

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

    【讨论】:

    • 注意:确保在-Ds3 之间放置一个空格,并且您还必须将其放在foobar.jar 部分之后。
    【解决方案3】:

    调整工人数量对我不起作用; 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
    

    【讨论】:

    • 注意:确保将 -D 命令放在 foobar.jar 命令之后
    • emr-5.29.0 中是/usr/share/aws/emr/s3-dist-cp/lib/s3-dist-cp.jar,而不是在上面给出的位置。
    【解决方案4】:

    问题在于 map - reduce 作业失败。 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/output --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]

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 2011-11-21
    • 2017-10-06
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多