【问题标题】:S3FS connector with Pyspark 3.2, Hadoop 3.3.1 hangs on spark.read.load()S3FS 连接器与 Pyspark 3.2、Hadoop 3.3.1 挂在 spark.read.load() 上
【发布时间】:2021-12-14 02:36:29
【问题描述】:

我现在花了好几个小时试图让 S3FS 与 Pyspark 3.2 / Hadoop 3.3.1 一起工作。我已经经历了各种 ClassDefNotFound 错误以及 hadoop-aws 和 aws-java-sdk jar 所具有的各种兼容性问题,但现在已经到了尝试从 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,所以现在我不确定我是变热还是变冷。

是否有人有他们用于 Pyspark 3.2 / Hadoop 3.3.1 的配置并具有 S3FS 访问权限?我需要降级吗?尽管 spark 3.0 + 会很好,但我并不依赖于任何特定版本。提前致谢。

【问题讨论】:

  • 使用你指定的 jars 我有一些 Class Not Found 错误。 pyspark 3.2.0 + aws for me 适用于--packages com.amazonaws:aws-java-sdk-bundle:1.11.375,org.apache.hadoop:hadoop-aws:3.2.0

标签: apache-spark hadoop amazon-s3 pyspark


【解决方案1】:

Dang,总是在您花时间输入问题后,解决方案就会出现。挂起的命令终于返回了,我能够从错误消息中确定我使用的 s3a 端点是错误的。所以应该是:

spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.amazonaws.com")

而不是

spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "us-east-1.amazonaws.com")

【讨论】:

  • 这和 fs.s3a.impl 的值是默认值 - 你根本不应该设置它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 2018-01-15
相关资源
最近更新 更多