S3N 和 S3A distcp 在 Hadoop 2.6.0 中不起作用

Posted

技术标签:

【中文标题】S3N 和 S3A distcp 在 Hadoop 2.6.0 中不起作用【英文标题】:S3N and S3A distcp not working in Hadoop 2.6.0 【发布时间】:2015-05-07 18:16:40 【问题描述】:

总结

Stock hadoop2.6.0 install 给了我no filesystem for scheme: s3n。现在将hadoop-aws.jar 添加到类路径中会得到ClassNotFoundException: org.apache.hadoop.fs.s3a.S3AFileSystem

详情

我有一个主要是库存安装的 hadoop-2.6.0。我只设置了目录,并设置了以下环境变量:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/jre
export HADOOP_COMMON_HOME=/opt/hadoop
export HADOOP_HOME=$HADOOP_COMMON_HOME
export HADOOP_HDFS_HOME=$HADOOP_COMMON_HOME
export HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME
export HADOOP_OPTS=-XX:-PrintWarnings
export PATH=$PATH:$HADOOP_COMMON_HOME/bin

hadoop classpath 是:

/opt/hadoop/etc/hadoop:/opt/hadoop/share/hadoop/common/lib/*:/opt/hadoop/share/hadoop/common/*:/opt/hadoop/share/hadoop/hdfs:/opt/hadoop/share/hadoop/hdfs/lib/*:/opt/hadoop/share/hadoop/hdfs/*:/opt/hadoop/share/hadoop/yarn/lib/*:/opt/hadoop/share/hadoop/yarn/*:/opt/hadoop/share/hadoop/mapreduce/lib/*:/opt/hadoop/share/hadoop/mapreduce/*:/contrib/capacity-scheduler/*.jar:/opt/hadoop/share/hadoop/tools/lib/*

当我尝试运行hadoop distcp -update hdfs:///files/to/backup s3n://$S3KEY:$S3SECRET@bucket/files/to/backup 时,我得到Error: java.io.Exception, no filesystem for scheme: s3n。如果我使用 s3a,我会收到同样的错误,抱怨 s3a。

internet 告诉我hadoop-aws.jar 默认不是类路径的一部分。我在/opt/hadoop/etc/hadoop/hadoop-env.sh 中添加了以下行:

HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_COMMON_HOME/share/hadoop/tools/lib/*

现在hadoop classpath 附加了以下内容:

:/opt/hadoop/share/hadoop/tools/lib/*

应该覆盖/opt/hadoop/share/hadoop/tools/lib/hadoop-aws-2.6.0.jar。现在我明白了:

Caused by: java.lang.ClassNotFoundException:
Class org.apache.hadoop.fs.s3a.S3AFileSystem not found

jar文件包含找不到的类:

unzip -l /opt/hadoop/share/hadoop/tools/lib/hadoop-aws-2.6.0.jar |grep S3AFileSystem
28349  2014-11-13 21:20   org/apache/hadoop/fs/s3a/S3AFileSystem.class

是否有添加这些罐子的命令,还是我错过了其他重要的东西?

【问题讨论】:

【参考方案1】:

根据 Abhishek 对他的回答的评论,我需要做的唯一更改是 ma​​pred-site.xml

<property>
  <!-- Add to the classpath used when running an M/R job -->
  <name>mapreduce.application.classpath</name>
  <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*,$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*,$HADOOP_MAPRED_HOME/share/hadoop/tools/lib/*</value>
</property>

无需更改任何其他 xml 或 sh 文件。

【讨论】:

【参考方案2】:

您可以通过在core-site.xml 中添加以下行来解决 s3n 问题

<property>
<name>fs.s3n.impl</name>
<value>org.apache.hadoop.fs.s3native.NativeS3FileSystem</value>
<description>The FileSystem for s3n: (Native S3) uris.</description>
</property>

添加该属性后它应该可以工作。

编辑:如果它不能解决您的问题,那么您将不得不在类路径中添加 jar。你能检查一下mapred-site.xml是否有mapreduce.application.classpath:/usr/hdp//hadoop-mapreduce/*。它将在类路径中包含其他相关的 jar :)

【讨论】:

使用s3n url 运行distcp,我得到java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3native.NativeS3FileSystem not found,即使那个确切的类在hadoop-aws-2.6.0.jar 您必须在类路径中添加 jar。你能检查一下 mapred-site.xml 是否有 mapreduce.application.classpath: /usr/hdp//hadoop-mapreduce/*.它将在类路径中包含其他相关的 jars Abhishek,看起来 mapreduce.application.classpath 是正确的路径(也是唯一需要更改的)。如果您发布/编辑答案,我会接受并删除我的。 @SteveArmstrong 对我的回答进行了编辑和添加评论 :)【参考方案3】:

在当前的 Hadoop (3.1.1) 中,这种方法不再有效。您可以通过取消注释 etc/hadoop/hadoop-env.sh 文件中的 HADOOP_OPTIONAL_TOOLS 行来解决此问题。在其他工具中,这启用了 hadoop-aws 库。

【讨论】:

以上是关于S3N 和 S3A distcp 在 Hadoop 2.6.0 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PySpark:AWS s3n 正在工作,但 s3a 没有

hadoop distcp 报错: Could not find any valid local directory for s3ablock-xxxx

hadoop distcp 报错: Could not find any valid local directory for s3ablock-xxxx

hadoop distcp 报错: Could not find any valid local directory for s3ablock-xxxx

pyWriteDynamicFrame:无法识别的方案空;预期 s3、s3n 或 s3a [胶水到 Redshift]

Hadoop DistCp 使用指南