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
不会出现在classpath
hadoop中.因此,尝试通过添加以下行添加到类路径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)
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)
归档时间: |
|
查看次数: |
29321 次 |
最近记录: |