Pyspark、Hadoop 和 S3:java.lang.NoSuchMethodError:org.apache.hadoop.fs.s3a.Listing$FileStatusListingIterator

问题描述 投票:0回答:1

我一直面临与让 delta-spark 直接与 S3 一起工作相关的兼容性问题,并希望获得一些建议。我已经尝试了 Spark、delta-spark、hadoop-aws 和 aws-java-sdk-bundle 之间的数十种版本组合,但我不断收到

NoSuchMethodError
的一些变体,这强烈表明存在兼容性错误。

我尝试过使用最新版本的 Spark (3.5.3) 和 delta-spark (3.2.1),但现在我一直在尝试他们网站上列出的明确示例。

根据:https://docs.delta.io/latest/delta-storage.html#-requirements-s3-single-cluster 他们说:

使用以下命令启动支持 Delta Lake 和 S3 的 Spark shell(假设您使用为 Hadoop 3.3.4 预先构建的 Spark 3.5.0):

并使用

--packages io.delta:delta-spark_2.12:3.1.0,org.apache.hadoop:hadoop-aws:3.3.4

根据其兼容性矩阵(https://docs.delta.io/latest/releases.html),3.1.0 可与 3.5.0 配合使用。因此,我重新安装了 pyspark 3.5.0 和 delta-spark 3.1.0 的软件包。

我的代码如下:

builder = pyspark.sql.SparkSession.builder.appName(app_name) \
        .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
        .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
        .config("spark.hadoop.fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider") \
        .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \
        .config("spark.hadoop.fs.s3a.access.key", aws_access_key_id) \
        .config("spark.hadoop.fs.s3a.secret.key", secret_access_key) \
        .config("spark.hadoop.fs.s3a.endpoint", f"s3.{region_name}.amazonaws.com") \
        .config("spark.hadoop.delta.enableFastS3AListFrom", True)

extra_packages = ["org.apache.hadoop:hadoop-aws:3.3.4,com.amazonaws:aws-java-sdk-bundle:1.12.262"]
spark = delta.configure_spark_with_delta_pip(
        builder,
        extra_packages=extra_packages,
).getOrCreate()
data = {
        'id': [1, 2, 3],
        'name': ['Alice', 'Bob', 'Charlie'],
}
df = spark.createDataFrame(pd.DataFrame(data))
deltalake_table_spark = f"s3a://{bucket}/test_folder/spark_deltalake_table"
df.write.format("delta").save(deltalake_table_spark)

错误输出的一大块是:

Traceback (most recent call last):
  File "...", line 183, in test_delta_spark
    df.write.format("delta").save(deltalake_table_spark)
  File ".../lib/python3.10/site-packages/pyspark/sql/readwriter.py", line 1463, in save
    self._jwrite.save(path)
  File ".../lib/python3.10/site-packages/py4j/java_gateway.py", line 1322, in __call__
    return_value = get_return_value(
  File ".../lib/python3.10/site-packages/pyspark/errors/exceptions/captured.py", line 179, in deco
    return f(*a, **kw)
  File ".../lib/python3.10/site-packages/py4j/protocol.py", line 326, in get_return_value
    raise Py4JJavaError(
py4j.protocol.Py4JJavaError: An error occurred while calling o69.save.
: com.google.common.util.concurrent.ExecutionError: java.lang.NoSuchMethodError: 'org.apache.hadoop.fs.s3a.Listing$FileStatusListingIterator org.apache.hadoop.fs.s3a.Listing.createFileStatusListingIterator(org.apache.hadoop.fs.Path, org.apache.hadoop.fs.s3a.S3ListRequest, org.apache.hadoop.fs.PathFilter, org.apache.hadoop.fs.s3a.Listing$FileStatusAcceptor)'
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2261)

并验证,

spark._sc._jvm.org.apache.hadoop.util.VersionInfo.getVersion()
Out[18]: '3.3.4'
spark.version
Out[19]: '3.5.0'

至于我的java版本:

java --version
openjdk 11.0.24 2024-07-16
OpenJDK Runtime Environment Homebrew (build 11.0.24+0)

检查错误日志的输出,可以看到安装了正确的版本:

:: modules in use:
    com.amazonaws#aws-java-sdk-bundle;1.12.262 from central in [default]
    io.delta#delta-spark_2.12;3.1.0 from central in [default]
    io.delta#delta-storage;3.1.0 from central in [default]
    org.antlr#antlr4-runtime;4.9.3 from central in [default]
    org.apache.hadoop#hadoop-aws;3.3.4 from central in [default]
    org.wildfly.openssl#wildfly-openssl;1.0.7.Final from central in [default]

一切似乎都是同步的。 3.3.4 hadoop 和 hadoop-aws、3.1.0 delta-spark、3.5.0 pyspark,我尝试过保留

aws-java-sdk-bundle
或根据版本兼容性进行更改。

我尝试过的其他事情:

  1. 我没有在构建器中定义 hadoop 配置,而是尝试在
    getOrCreate
    之后使用
    spark._jsc.hadoopConfiguration().set(...)
  2. 进行此操作
  3. 我没有使用
    configure_spark_with_delta_pip
    ,而是在配置中手动输入
    delta-spark
    jar 包,并在构建器定义中使用
    .config("spark.jars.packages", "io.delta:delta-spark_2.12:3.1.0,org.apache.hadoop:hadoop-aws:3.3.4,com.amazonaws:aws-java-sdk-bundle:1.12.262")

我没有选择,并且搜索了许多其他线程,但我没有成功地运行它。有人可以确认这是否确实是兼容性问题还是我还缺少其他内容吗?谢谢你。

python apache-spark amazon-s3 hadoop pyspark
1个回答
0
投票

这个问题你解决了吗?由于某些原因我无法发表评论并询问你。我有完全相同的问题 - 似乎无法调试。

© www.soinside.com 2019 - 2024. All rights reserved.