我正在尝试使用pySpark从本地spark上下文访问s3文件。
我一直在File "C:\Spark\python\lib\py4j-0.9-src.zip\py4j\protocol.py", line 308, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o20.parquet.
: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3native.NativeS3FileSystem not found
我设置了os.environ['AWS_ACCESS_KEY_ID']
和
在我致电os.environ['AWS_SECRET_ACCESS_KEY']
之前df = sqc.read.parquet(input_path)
。我还添加了这些行:
hadoopConf.set("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
hadoopConf.set("fs.s3.awsSecretAccessKey", os.environ["AWS_SECRET_ACCESS_KEY"])
hadoopConf.set("fs.s3.awsAccessKeyId", os.environ["AWS_ACCESS_KEY_ID"])
我也尝试将s3
更改为s3n
,s3a
。两者都没有。
知道如何让它发挥作用吗? 我在Windows 10,pySpark,Spark 1.6.1上为Hadoop 2.6.0构建
答案 0 :(得分:6)
我正在运行pyspark,附加来自 hadoop-aws 的库。
您需要在输入路径中使用 s3n 。我是从Mac-OS运行的。所以我不确定它是否适用于Windows。
$SPARK_HOME/bin/pyspark --packages org.apache.hadoop:hadoop-aws:2.7.1
答案 1 :(得分:0)
此包声明甚至可以在spark-shell中使用
spark-shell --packages org.apache.hadoop:hadoop-aws:2.7.1
并在shell中指定
sc.hadoopConfiguration.set(“fs.s3n.awsAccessKeyId”,“xxxxxxxxxxxxx”) sc.hadoopConfiguration.set(“fs.s3n.awsSecretAccessKey”,“xxxxxxxxxxxxxxxxx”)