我一直面临与让 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
或根据版本兼容性进行更改。
我尝试过的其他事情:
getOrCreate
之后使用 spark._jsc.hadoopConfiguration().set(...)
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")
。我没有选择,并且搜索了许多其他线程,但我没有成功地运行它。有人可以确认这是否确实是兼容性问题还是我还缺少其他内容吗?谢谢你。
这个问题你解决了吗?由于某些原因我无法发表评论并询问你。我有完全相同的问题 - 似乎无法调试。