如何使用spark 3.0.0从s3读写?

sg24os4d  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(639)

我正在尝试启动一个spark应用程序,它应该能够读写s3,在kubernetes和pyspark版本3.0.0上使用spark操作符。spark操作符运行得很好,但我很快意识到启动的应用程序无法正确读取s3中的文件。
此命令: spark.read.json("s3a://bucket/path/to/data.json") 正在引发此异常:

py4j.protocol.Py4JJavaError: An error occurred while calling o58.json.
java.lang.RuntimeException: java.lang.ClassNotFoundException: 
Class org.apache.hadoop.fs.s3a.S3AFileSystem not found

我第一次用这个 gcr.io/spark-operator/spark-py:v3.0.0 作为spark图像,然后尝试添加一些 .jars 但没有成功:

ADD https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.9/httpclient-4.5.9.jar $SPARK_HOME/jars
ADD https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/2.7.4/hadoop-aws-2.7.4.jar $SPARK_HOME/jars
ADD https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk/1.7.4/aws-java-sdk-1.7.4.jar $SPARK_HOME/jars

以下是我的spark conf:

"spark.hadoop.fs.s3a.endpoint": "S3A_ENDPOINT"
    "spark.hadoop.fs.s3a.access.key": "ACCESS_KEY"
    "spark.hadoop.fs.s3a.secret.key": "SECRET_KEY"
    "spark.hadoop.fs.s3a.connection.ssl.enabled": "false"
    "spark.hadoop.fs.s3a.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem"
    "spark.hadoop.fs.s3a.path.style.access": "true"
    "spark.driver.extraClassPath": "/opt/spark/jars/*"
    "spark.executor.extraClassPath": "/opt/spark/jars/*"

还有我的 $SPARK_HOME/opt/spark .
有人能用spark 3.0.0从s3读写吗?这是pyspark的独家问题吗?我怎样才能“解决”这个问题?提前谢谢!

uurv41yg

uurv41yg1#

我找到了方法:下面是一个fork,其中包含了我对base docker映像所做的更改(只是一些更改):
https://github.com/coqueiro/spark/tree/branch-3.0-s3 我创建了一个makefile来帮助创建发行版,但我基本上只是按照官方文档:
http://spark.apache.org/docs/latest/building-spark.html
另外,这张图片已经构建并推送到docker hub:https://hub.docker.com/repository/docker/coqueirotree/spark-py
它支持spark 3.0.0、hadoop 3.2.0、s3a和kubernetes。

vbkedwbf

vbkedwbf2#

您是否尝试过使用带有预构建hadoop库的spark jarhttps://spark.apache.org/downloads.html 还可以将hadoop依赖项添加到类路径中。

相关问题