【问题标题】:PySpark 2.2.0 Write DataFrame to S3 AmazonServiceException Class Not FoundPySpark 2.2.0 将 DataFrame 写入 S3 AmazonServiceException 类未找到
【发布时间】: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


【解决方案1】:

不要尝试使用 Hadoop-aws JAR 和 AWS 开发工具包。与随附的不同; AWS SDK 在版本之间变化太多。对于 hadoop-2.9.0,您需要 aws-java-sdk-bundle 版本 1.11.199

见mvnrepo/hadoop-aws

【讨论】:

    猜你喜欢
    • 2019-01-16
    • 2021-02-09
    • 2018-05-24
    • 2017-01-31
    • 2018-05-23
    • 2020-05-20
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多