我正在尝试使用Kubernetes上的Spark Operator和pySpark版本3.0.0启动一个能够对S3进行读写的Spark应用程序。Spark Operator运行得很好,但我很快意识到启动的应用程序无法正确读取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会议:
"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独有的问题吗?我该如何“修复”这个问题呢?提前感谢!
发布于 2020-07-28 05:10:40
我想出了如何做到这一点:下面是我对基础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,Hadoop3.2.0,S3A和Kubernetes。
发布于 2020-07-24 22:13:42
您是否尝试过使用具有预先构建的Hadoop库https://spark.apache.org/downloads.html的spark jars,您还可以将Hadoop依赖项添加到您的类路径中。
https://stackoverflow.com/questions/63075293
复制相似问题