【发布时间】:2017-12-09 23:11:21
【问题描述】:
我正在尝试使用 pyspark 将 Spark DataFrame 写入 S3。我正在使用 Spark 2.2.0 版。
sc = SparkContext('local', 'Test')
sc._jsc.hadoopConfiguration().set("fs.s3a.awsAccessKeyId", aws_key)
sc._jsc.hadoopConfiguration().set("fs.s3a.awsSecretAccessKey", aws_secret)
sc._jsc.hadoopConfiguration().set("fs.s3a.multipart.uploads.enabled", "true")
spark = sql.SparkSession \
.builder \
.appName("TEST") \
.getOrCreate()
sql_context = sql.SQLContext(sc, spark)
filename = 'gerrymandering'
s3_uri = 's3a://mybucket/{}'.format(filename)
print(s3_uri)
df = sql_context.createDataFrame([('1', '4'), ('2', '5'), ('3', '6')], ["A", "B"])
df.write.parquet(s3_uri)
我得到的回溯是:
File "/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py", line 319, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o48.save.
: java.lang.NoClassDefFoundError: com/amazonaws/AmazonServiceException
我不确定,但似乎存在 jar 依赖错误。我尝试了多个版本的hadoop-aws-X.jar 和aws-java-sdk-X.jar,但它们都产生了同样的错误。
在撰写本文时,我的命令是:
spark-submit --jars hadoop-aws-2.9.0.jar,aws-java-sdk-1.7.4.jar test.py
关于如何解决这个NoClassDefFoundError的任何想法?
【问题讨论】:
-
您是否尝试过使用“编译”范围将这些 jar 包含在 fatjar 中(以消除版本冲突的可能性)?
-
您使用的是哪个集群管理器?
-
@xmorera:我正在使用独立管理器,因为它现在在本地运行
-
@sgireddy:我在 Spark 文档中找不到任何提及您所描述的工作流程的内容。你知道我在哪里可以找到东西吗?
-
您的 spark-submit 命令可能正在尝试在提交作业的同一路径中查找 jar,您是否将 aws sdk jar 放置在正确的路径并提供完整路径。有关此错误说明,请参阅此链接。 sparkour.urizone.net/recipes/using-s3
标签: apache-spark amazon-s3 pyspark pyspark-sql