首页 > 解决方案 > hadoop 将结果从 hdfs 复制到 S3

问题描述

我已经成功完成了我在 Amazon EMR 上的工作,现在我想将结果复制HDFSS3,但我遇到了一些问题

这是代码(--steps)

{
    "Name":"AAAAA",
    "Type":"CUSTOM_JAR",
    "Jar":"command-runner.jar",
    "ActionOnFailure":"CONTINUE",
    "Args": [
        "s3-dist-cp",
        "--src", "hdfs:///seqaddid_output",
        "--dest", "s3://wuda-notebook/seqaddid"
    ]  
}

这是日志:

2019-04-12 03:01:23,571 INFO com.amazon.elasticmapreduce.s3distcp.S3DistCp(主要):使用 args 运行:-libjars /usr/share/aws/emr/s3-dist-cp/lib/commons-httpclient -3.1.jar,/usr/share/aws/emr/s3-dist-cp/lib/commons-logging-1.0.4.jar,/usr/share/aws/emr/s3-dist-cp/lib/guava -18.0.jar,/usr/share/aws/emr/s3-dist-cp/lib/s3-dist-cp-2.10.0.jar,/usr/share/aws/emr/s3-dist-cp/lib /s3-dist-cp.jar --src hdfs:///seqaddid_output/ --dest s3://wuda-notebook/seqaddid 2019-04-12 03:01:24,196 INFO com.amazon.elasticmapreduce.s3distcp.S3DistCp (主要):S3DistCp 参数:--src hdfs:///seqaddid_output/--dest s3://wuda-notebook/seqaddid 2019-04-12 03:01:24,203 INFO com.amazon.elasticmapreduce.s3distcp.S3DistCp ( main):使用输出路径'hdfs:/tmp/4f93d497-fade-4c78-86b9-59fc3da35b4e/output' 2019-04-12 03:01:24,263 INFO com.amazon.elasticmapreduce.s3distcp。S3DistCp(主):GEThttp://169.254.169.254/latest/meta-data/placement/availability-zone结果:us-east-1f 2019-04-12 03:01:24,664 FATAL com.amazon.elasticmapreduce.s3distcp.S3DistCp(主):无法获取源文件系统 java.io.FileNotFoundException:文件不存在:hdfs: /seqaddid_output at org.apache.hadoop.hdfs.DistributedFileSystem$27.doCall(DistributedFileSystem.java:1444) at org.apache.hadoop.hdfs.DistributedFileSystem$27.doCall(DistributedFileSystem.java:1437) at org.apache.hadoop.fs .FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81) at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1452) at com.amazon.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:795) at com.amazon.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:705) 在 org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76) 在 org.apache.hadoop.util。ToolRunner.run(ToolRunner.java:90) 在 com.amazon.elasticmapreduce.s3distcp.Main.main(Main.java:22) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke( NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.hadoop.util.RunJar.run (RunJar.java:234) 在 org.apache.hadoop.util.RunJar.main(RunJar.java:148)在 org.apache.hadoop.util.RunJar.run(RunJar.java:234) 在 org.apache.hadoop 的 java.lang.reflect.Method.invoke(Method.java:498) 调用(DelegatingMethodAccessorImpl.java:43) .util.RunJar.main(RunJar.java:148)在 org.apache.hadoop.util.RunJar.run(RunJar.java:234) 在 org.apache.hadoop 的 java.lang.reflect.Method.invoke(Method.java:498) 调用(DelegatingMethodAccessorImpl.java:43) .util.RunJar.main(RunJar.java:148)

标签: amazon-web-servicesamazon-s3amazon-emr

解决方案


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

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


推荐阅读