S3N 和 S3A distcp 在 Hadoop 2.6.0 中不工作
S3N and S3A distcp not working in Hadoop 2.6.0
总结
stock hadoop2.6.0安装给我no filesystem for scheme: s3n
。现在将 hadoop-aws.jar
添加到 class 路径会得到 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 的相同错误。
告诉我默认情况下 hadoop-aws.jar
不是 class 路径的一部分。我将以下行添加到 /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 文件包含 class 无法找到:
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
是否有添加这些罐子的命令,或者我是否遗漏了其他重要的东西?
您可以通过向 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>
添加 属性 后应该可以工作。
编辑: 如果它不能解决您的问题,那么您将不得不在类路径中添加 jars。你能检查 mapred-site.xml 是否有 mapreduce.application.classpath: /usr/hdp//hadoop-mapreduce/*.它将在类路径中包含其他相关的 jar :)
根据 Abhishek 对他的回答的评论,我唯一需要做的改变是 mapred-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 文件进行更改。
在当前的 Hadoop (3.1.1) 中,这种方法不再有效。您可以通过取消注释 etc/hadoop/hadoop-env.sh 文件中的 HADOOP_OPTIONAL_TOOLS 行来解决此问题。在其他工具中,这会启用 hadoop-aws 库。
总结
stock hadoop2.6.0安装给我no filesystem for scheme: s3n
。现在将 hadoop-aws.jar
添加到 class 路径会得到 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 的相同错误。
hadoop-aws.jar
不是 class 路径的一部分。我将以下行添加到 /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 文件包含 class 无法找到:
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
是否有添加这些罐子的命令,或者我是否遗漏了其他重要的东西?
您可以通过向 core-site.xml
<property>
<name>fs.s3n.impl</name>
<value>org.apache.hadoop.fs.s3native.NativeS3FileSystem</value>
<description>The FileSystem for s3n: (Native S3) uris.</description>
</property>
添加 属性 后应该可以工作。
编辑: 如果它不能解决您的问题,那么您将不得不在类路径中添加 jars。你能检查 mapred-site.xml 是否有 mapreduce.application.classpath: /usr/hdp//hadoop-mapreduce/*.它将在类路径中包含其他相关的 jar :)
根据 Abhishek 对他的回答的评论,我唯一需要做的改变是 mapred-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 文件进行更改。
在当前的 Hadoop (3.1.1) 中,这种方法不再有效。您可以通过取消注释 etc/hadoop/hadoop-env.sh 文件中的 HADOOP_OPTIONAL_TOOLS 行来解决此问题。在其他工具中,这会启用 hadoop-aws 库。