s3distcp在CDH4.5上没有为我工作

时间:2013-12-12 19:33:07

标签: hadoop

我正在运行CDH4.5。我试图使用distcp s3n但是因为我升级到4.5而遇到了问题。 我试图让s3distcp启动并运行,但是我遇到了问题。我下载了它,并且正在运行此命令:

hadoop jar /usr/lib/hadoop/lib/s3distcp.jar  --src hdfs://NN:8020/path/to/destination/folder --dest s3n://acceseKeyId:secretaccesskey@mybucket/destination/

但我收到的错误是:

INFO mapred.JobClient:  map 100% reduce 0%
INFO mapred.JobClient: Task Id : attempt_201312042223_10889_r_000001_0, Status : FAILED
Error: java.lang.ClassNotFoundException: com.amazonaws.services.s3.AmazonS3
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at com.amazon.external.elasticmapreduce.s3distcp.CopyFilesReducer.executeDownloads(CopyFilesReducer.java:209)
    at com.amazon.external.elasticmapreduce.s3distcp.CopyFilesReducer.reduce(CopyFilesReducer.java:196)
    at com.amazon.external.elasticmapreduce.s3distcp.CopyFilesReducer.reduce(CopyFilesReducer.java:30)
    at org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:506)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:447)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax

INFO mapred.JobClient: Job Failed: NA
13/12/12 13:55:25 INFO s3distcp.S3DistCp: Try to recursively delete hdfs:/tmp/985ffdb0-1bc8-4d00-aba6-fd9b18e905f1/tempspace
Exception in thread "main" java.lang.RuntimeException: Error running job
    at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:586)
    at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:216)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
    at com.amazon.external.elasticmapreduce.s3distcp.Main.main(Main.java:12)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:208)
Caused by: java.io.IOException: Job failed!
    at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1388)
    at com.amazon.external.elasticmapreduce.s3distcp.S3DistCp.run(S3DistCp.java:568)

然后我将访问密钥和id放入我的core-site.xml中的所有数据和名称节点:

<property>
    <name>fs.s3.awsSecretAccessKey</name>
    <value>bippitybopityboo</value>
  </property>   
  <property>
    <name>fs.s3.awsAccessKeyId</name>
    <value>supercalifragilisticexpialadoscious</value>
  </property>
  <property>
    <name>fs.s3n.awsSecretAccessKey</name>
    <value>bippitybopityboo</value>
  </property>
  <property>
    <name>fs.s3n.awsAccessKeyId</name>
    <value>supercalifragilisticexpialadoscious</value>
  </property>

当我尝试这个时仍然得到同样的错误:

hadoop jar /usr/lib/hadoop/lib/s3distcp.jar  --src hdfs://NN:8020/path/to/destination/folder --dest s3n://mybucket/destination/

我应该做一些配置,还是我错过了一些jar文件或执行错误?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

有同样的问题。修复是从s3n更改为s3a。

# change from this
--dest s3n://acceseKeyId:secretaccesskey@mybucket/destination/
# to this
--dest s3a://acceseKeyId:secretaccesskey@mybucket/destination/

另见:S3 Support in Apache Hadoop

s3已被弃用s3n未被维护,因此请继续使用s3a。

S3A是Hadoop 2.7及更高版本的推荐S3客户端

  

S3 Native:s3n://文件系统的继承者,S3a:系统使用   亚马逊的图书馆与S3互动。这允许S3a支持   较大的文件(不超过5GB限制),更高的性能操作和   更多。文件系统旨在替代/后继   S3 Native:从s3n:// URL可访问的所有对象也应该是   只需替换URL架构即可从s3a访问。

     

未维护:S3N文件系统(URI方案:s3n://)

     

S3N是Hadoop 2.6及更早版本的S3客户端。来自Hadoop 2.7+,   切换到s3a

     

用于在S3.With上读写常规文件的本机文件系统   这个文件系统是你可以访问S3上写的文件   与其他工具。相反,其他工具可以访问写入的文件   使用Hadoop。 S3N代码是稳定且广泛使用的,但事实并非如此   添加任何新功能(这就是它保持稳定的原因)。

     

S3N需要在类路径上使用兼容版本的jets3t JAR。

     

自Hadoop 2.6以来,S3集成的所有工作都与S3A有关。 S3N是   除了安全风险之外没有维护 - 这有助于保证   安全。针对S3N的大多数错误报告将以WONTFIX和   文本&#34;使用S3A&#34;。如果可以的话,请切换到S3A,然后尝试一下   在提交针对S3N的错误报告之前。

     

(已弃用)S3 Block FileSystem(URI scheme:s3://)

答案 1 :(得分:-1)

您需要AWS SDK for Java。从http://aws.amazon.com/de/sdkforjava/抓取它,然后将jar放入/usr/lib/hadoop/lib或使用-libjars选项传递它。假设AWS SDK的1.7.1版本,该命令将如下所示:

hadoop jar /usr/lib/hadoop/lib/s3distcp.jar \
    -libjars aws-java-sdk-1.7.1/lib/aws-java-sdk-1.7.1.jar \
    --src hdfs://NN:8020/path/to/destination/folder \
    --dest s3n://acceseKeyId:secretaccesskey@mybucket/destination/

参考文献: