如何从本地hadoop2.6安装访问s3/s3n?

v2g6jxz6  于 2021-06-04  发布在  Hadoop
关注(0)|答案(5)|浏览(565)

我试图在本地机器上复制一个amazon emr集群。为此,我安装了hadoop的最新稳定版本-2.6.0。现在我想访问一个s3存储桶,就像我在emr集群中所做的那样。
我在core-site.xml中添加了aws凭据:

<property>
  <name>fs.s3.awsAccessKeyId</name>
  <value>some id</value>
</property>

<property>
  <name>fs.s3n.awsAccessKeyId</name>
  <value>some id</value>
</property>

<property>
  <name>fs.s3.awsSecretAccessKey</name>
  <value>some key</value>
</property>

<property>
  <name>fs.s3n.awsSecretAccessKey</name>
  <value>some key</value>
</property>

注意:由于键上有一些斜杠,我用%2f对它们进行了转义
如果我尝试列出桶中的内容:

hadoop fs -ls s3://some-url/bucket/

我得到这个错误:
ls:方案s3没有文件系统
我再次编辑了core-site.xml,并添加了与fs相关的信息:

<property>
  <name>fs.s3.impl</name>
  <value>org.apache.hadoop.fs.s3.S3FileSystem</value>
</property>

<property>
  <name>fs.s3n.impl</name>
  <value>org.apache.hadoop.fs.s3native.NativeS3FileSystem</value>
</property>

这次我得到了一个不同的错误:

-ls: Fatal internal error
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3.S3FileSystem not found
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2074)
        at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2578)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2591)

不知何故,我怀疑Yarn分布没有必要的jar能够读取s3,但我不知道从哪里得到这些。任何这方面的指示都将不胜感激。

nom7f22z

nom7f22z1#

@ashrith的回答对我有一个修改:我必须使用 $HADOOP_PREFIX 而不是 $HADOOP_HOME 在ubuntu上运行v2.6时。也许这是因为听起来 $HADOOP_HOME 不赞成吗? export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${HADOOP_PREFIX}/share/hadoop/tools/lib/* 话虽如此,这两个版本在我的mac上都不起作用,我的mac是通过自制软件安装v2.6的。在这种情况下,我使用了这个非常笨拙的导出: export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$(brew --prefix hadoop)/libexec/share/hadoop/tools/lib/*

ki0zmccv

ki0zmccv2#

import os
os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk:1.10.34,org.apache.hadoop:hadoop-aws:2.6.0 pyspark-shell'

import pyspark
sc = pyspark.SparkContext("local[*]")

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

hadoopConf = sc._jsc.hadoopConfiguration()
myAccessKey = input() 
mySecretKey = input()
hadoopConf.set("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
hadoopConf.set("fs.s3.awsAccessKeyId", myAccessKey)
hadoopConf.set("fs.s3.awsSecretAccessKey", mySecretKey)

df = sqlContext.read.parquet("s3://myBucket/myKey")
vmjh9lq9

vmjh9lq93#

如果您使用的是hdp2.x或更高版本,可以尝试在ambari的mapreduce2配置设置中修改以下属性。
mapreduce.application.classpath
将以下值附加到现有字符串的末尾:
/usr/hdp/${hdp.version}/hadoopMap减少/*

bxpogfeg

bxpogfeg4#

不知什么原因,jar hadoop-aws-[version].jar 其中包含 NativeS3FileSystem 不存在于 classpath 在2.6和2.7版本中默认使用hadoop的。因此,尝试通过在中添加以下行将其添加到类路径 hadoop-env.sh 位于 $HADOOP_HOME/etc/hadoop/hadoop-env.sh :

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/tools/lib/*

假设您使用的是ApacheHadoop2.6或2.7
顺便说一下,您可以使用以下方法检查hadoop的类路径:

bin/hadoop classpath
iszxjhcz

iszxjhcz5#

为了解决这个问题,我尝试了以上所有方法,但都失败了(无论如何,对于我的环境)。
不过,通过将上面提到的两个jar从tools dir复制到common/lib中,我可以让它正常工作。
在那之后工作得很好。

相关问题