为了在 spark 中实现 java 和 python 之间的这种融合,还有很多工作要做。
主要是不同 jar 之间的版本兼容性问题。确保不同组件的一致性可以成为您解决此类问题的起点
Hadoop 版本
导航到安装spark 的位置,确保*hadoop* 的版本一致是迈向spark 的第一步
[? vaebhav@localhost:/usr/local/Cellar/apache-spark/3.1.2/libexec/jars - 10:39 PM ?]$ ls -lthr *hadoop-*
-rw-r--r-- 1 vaebhav root 79K May 24 10:15 hadoop-yarn-server-web-proxy-3.2.0.jar
-rw-r--r-- 1 vaebhav root 1.3M May 24 10:15 hadoop-yarn-server-common-3.2.0.jar
-rw-r--r-- 1 vaebhav root 221K May 24 10:15 hadoop-yarn-registry-3.2.0.jar
-rw-r--r-- 1 vaebhav root 2.8M May 24 10:15 hadoop-yarn-common-3.2.0.jar
-rw-r--r-- 1 vaebhav root 310K May 24 10:15 hadoop-yarn-client-3.2.0.jar
-rw-r--r-- 1 vaebhav root 3.1M May 24 10:15 hadoop-yarn-api-3.2.0.jar
-rw-r--r-- 1 vaebhav root 84K May 24 10:15 hadoop-mapreduce-client-jobclient-3.2.0.jar
-rw-r--r-- 1 vaebhav root 1.6M May 24 10:15 hadoop-mapreduce-client-core-3.2.0.jar
-rw-r--r-- 1 vaebhav root 787K May 24 10:15 hadoop-mapreduce-client-common-3.2.0.jar
-rw-r--r-- 1 vaebhav root 4.8M May 24 10:15 hadoop-hdfs-client-3.2.0.jar
-rw-r--r-- 1 vaebhav root 3.9M May 24 10:15 hadoop-common-3.2.0.jar
-rw-r--r-- 1 vaebhav root 43K May 24 10:15 hadoop-client-3.2.0.jar
-rw-r--r-- 1 vaebhav root 136K May 24 10:15 hadoop-auth-3.2.0.jar
-rw-r--r-- 1 vaebhav root 59K May 24 10:15 hadoop-annotations-3.2.0.jar
-rw-r--r--@ 1 vaebhav root 469K Oct 9 00:30 hadoop-aws-3.2.0.jar
[? vaebhav@localhost:/usr/local/Cellar/apache-spark/3.1.2/libexec/jars - 10:39 PM ?]$
对于像 S3 这样的进一步的 3rd 方连接,您可以通过搜索相应的 jar 来检查来自 MVN Repository 的相应编译依赖项,在您的情况下 - hadoop-aws-2.7.3.jar
MVN 编译依赖
通过在 mvn 存储库下搜索相应的工件,应该检查相应的 aws jdk jar 在编译依赖项下
这些检查点可以作为您确保正确依赖关系的入口点
依赖关系排序后,S3连接还有额外的步骤
PySpark S3 示例
AWS SDK 目前支持 s3a 或 s3n ,我已经演示了如何建立s3a,后一个也很容易实现
实现之间的差异可以在这个精彩的answer中找到
from pyspark import SparkContext
from pyspark.sql import SQLContext
import configparser
sc = SparkContext.getOrCreate()
sql = SQLContext(sc)
hadoop_conf = sc._jsc.hadoopConfiguration()
config = configparser.ConfigParser()
config.read(os.path.expanduser("~/.aws/credentials"))
access_key = config.get("<aws-account>", "aws_access_key_id")
secret_key = config.get("<aws-account>", "aws_secret_access_key")
session_key = config.get("<aws-account>", "aws_session_token")
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.amazonaws.com")
sc._jsc.hadoopConfiguration().set("fs.s3a.connection.ssl.enabled", "true")
sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem");
hadoop_conf.set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider")
hadoop_conf.set("fs.s3a.access.key", access_key)
hadoop_conf.set("fs.s3a.secret.key", secret_key)
hadoop_conf.set("fs.s3a.session.token", session_key)
s3_path = "s3a://<s3-path>/"
sparkDF = sql.read.parquet(s3_path)