S3FS 连接器与 Pyspark 3.2、Hadoop 3.3.1 挂起 spark.read.load()
S3FS connector with Pyspark 3.2, Hadoop 3.3.1 hangs on spark.read.load()
我已经花了好几个小时试图让 S3FS 与 Pyspark 3.2 / Hadoop 3.3.1 一起工作。我已经经历了各种 ClassDefNotFound 错误以及 hadoop-aws 和 aws-java-sdk 罐子所具有的各种兼容性问题,但现在已经达到了我在尝试阅读时不再遇到任何异常的地步来自 S3 的文件 - 相反,应用程序只是无限期挂起。这是我当前的配置:
os.environ.update({'AWS_ACCESS_KEY_ID': 'SOME_SECRET_KEY',
'AWS_SECRET_ACCESS_KEY': 'SOME_SECRET_ACCESS_KEY'}
conf = SparkConf() \
.set('spark.jars.packages', 'org.apache.hadoop:hadoop-aws:3.3.1,com.amazonaws:aws-java-sdk-bundle:1.11.901') # also tried aws-java-sdk-bundle:1.12.96
sc = SparkContext(conf=conf)
spark = SparkSession(sc).builder.appName('test').getOrCreate()
spark._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider", "com.amazonaws.auth.EnvironmentVariableCredentialsProvider")
spark._jsc.hadoopConfiguration().set("fs.s3a.impl","org.apache.hadoop.fs.s3a.S3AFileSystem")
spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "us-east-1.amazonaws.com")
print(f'pyspark hadoop version: {spark.sparkContext._jvm.org.apache.hadoop.util.VersionInfo.getVersion()}')
# executes this and a warning about missing hadoop-metrics2-s3a-file-system.properties, then hangs for good
df = spark.read.format('csv').load('s3a://bucket/file.csv').toPandas()
我也尝试了 org.apache.spark:spark-hadoop-cloud_2.13:3.2.0
包而不是 hadoop-aws,正如官方 spark 文档 here 中所建议的那样,但这也以同样的方式挂起。在此之前,我尝试过的每个配置通常都会导致 java.lang.ClassNotFoundException: com.amazonaws.auth.AWSCredentialsProvider
,所以现在我不确定我是变热了还是变冷了。
是否有人拥有用于具有 S3FS 访问权限的 Pyspark 3.2/Hadoop 3.3.1 的配置?我需要降级吗?我不依赖于任何特定版本,尽管 spark 3.0 + 会很好。提前致谢。
该死,在您花时间输入问题后总是会出现解决方案。挂起的命令终于返回了,我可以从错误消息中确定我使用的 s3a 端点是错误的。所以应该是:
spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.amazonaws.com")
而不是
spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "us-east-1.amazonaws.com")
我已经花了好几个小时试图让 S3FS 与 Pyspark 3.2 / Hadoop 3.3.1 一起工作。我已经经历了各种 ClassDefNotFound 错误以及 hadoop-aws 和 aws-java-sdk 罐子所具有的各种兼容性问题,但现在已经达到了我在尝试阅读时不再遇到任何异常的地步来自 S3 的文件 - 相反,应用程序只是无限期挂起。这是我当前的配置:
os.environ.update({'AWS_ACCESS_KEY_ID': 'SOME_SECRET_KEY',
'AWS_SECRET_ACCESS_KEY': 'SOME_SECRET_ACCESS_KEY'}
conf = SparkConf() \
.set('spark.jars.packages', 'org.apache.hadoop:hadoop-aws:3.3.1,com.amazonaws:aws-java-sdk-bundle:1.11.901') # also tried aws-java-sdk-bundle:1.12.96
sc = SparkContext(conf=conf)
spark = SparkSession(sc).builder.appName('test').getOrCreate()
spark._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider", "com.amazonaws.auth.EnvironmentVariableCredentialsProvider")
spark._jsc.hadoopConfiguration().set("fs.s3a.impl","org.apache.hadoop.fs.s3a.S3AFileSystem")
spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "us-east-1.amazonaws.com")
print(f'pyspark hadoop version: {spark.sparkContext._jvm.org.apache.hadoop.util.VersionInfo.getVersion()}')
# executes this and a warning about missing hadoop-metrics2-s3a-file-system.properties, then hangs for good
df = spark.read.format('csv').load('s3a://bucket/file.csv').toPandas()
我也尝试了 org.apache.spark:spark-hadoop-cloud_2.13:3.2.0
包而不是 hadoop-aws,正如官方 spark 文档 here 中所建议的那样,但这也以同样的方式挂起。在此之前,我尝试过的每个配置通常都会导致 java.lang.ClassNotFoundException: com.amazonaws.auth.AWSCredentialsProvider
,所以现在我不确定我是变热了还是变冷了。
是否有人拥有用于具有 S3FS 访问权限的 Pyspark 3.2/Hadoop 3.3.1 的配置?我需要降级吗?我不依赖于任何特定版本,尽管 spark 3.0 + 会很好。提前致谢。
该死,在您花时间输入问题后总是会出现解决方案。挂起的命令终于返回了,我可以从错误消息中确定我使用的 s3a 端点是错误的。所以应该是:
spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.amazonaws.com")
而不是
spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "us-east-1.amazonaws.com")