如何从本地Hadoop 2.6安装访问S3/S3n?

dou*_*yte 31 hadoop amazon-s3 amazon-web-services hadoop-yarn hadoop2

我正在尝试在本地计算机上重现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>
Run Code Online (Sandbox Code Playgroud)

注意:由于密钥上有一些斜杠,我已使用%2F转义它们

如果我尝试列出存储桶的内容:

hadoop fs -ls s3://some-url/bucket/
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ls:没有用于方案的FileSystem: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>
Run Code Online (Sandbox Code Playgroud)

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

-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)
Run Code Online (Sandbox Code Playgroud)

不知怎的,我怀疑纱线分布没有必要的罐子能够读取S3,但我不知道从哪里获得这些.任何指向这个方向的人都会非常感激.

Ash*_*ith 53

出于某种原因,默认情况下,版本2.6和2.7中hadoop-aws-[version].jar包含实现的jar NativeS3FileSystem不会出现在classpathhadoop中.因此,尝试通过添加以下行添加到类路径hadoop-env.sh$HADOOP_HOME/etc/hadoop/hadoop-env.sh:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/tools/lib/*
Run Code Online (Sandbox Code Playgroud)

假设您使用的是Apache Hadoop 2.6或2.7

顺便说一句,您可以使用以下方法检查Hadoop的类路径:

bin/hadoop classpath
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答:这确实是问题,我希望它可以帮助后续用户面对同样的问题.让我通过在库路径之前添加$ HADOOP_HOME路径来纠正导出:export`HADOOP_CLASSPATH = $ HADOOP_CLASSPATH:$ HADOOP_HOME/share/hadoop/tools/lib/*` (4认同)

ksi*_*ndi 8

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")
Run Code Online (Sandbox Code Playgroud)