【问题标题】:Py4JJavaError error when reading csv from S3 with Spark使用 Spark 从 S3 读取 csv 时出现 Py4JJavaError 错误
【发布时间】:2021-05-13 07:49:22
【问题描述】:

我正在尝试使用 Spark 从 AWS S3 存储桶中读取 CSV 文件,目前通过 Jupyter 笔记本进行。

为 spark 设置 AWS S3 配置后,我在尝试读取 CSV 时收到此错误:

Py4JJavaError: An error occurred while calling SOMERANDOMNAME.csv.
: com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400, AWS Service: Amazon S3, AWS Request ID: XXXXXXXXXX, AWS Error Code: null, AWS Error Message: Bad Request, S3 Extended Request ID: XXXXXXXXXXX

我设置配置的方式:

hadoopConf = spark.sparkContext._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.endpoint", s3_endpoint_url)
hadoopConf.set("fs.s3a.access.key", s3_access_key_id)
hadoopConf.set("fs.s3a.secret.key", s3_secret_access_key)
hadoopConf.set("fs.s3a.path.style.access", "true")

我尝试读取 CSV 的方式:

data = spark.read.csv('s3a://' + s3_bucket + '/data.csv',sep=",", header=True)

运行该块会向我发送上述错误。你能帮我看看可能出了什么问题吗?

提前谢谢你!

【问题讨论】:

  • 这能回答你的问题吗? Amazon s3a returns 400 Bad Request with Spark
  • 不是真的,我尝试了那里写的内容,但没有运气仍然得到错误。 Py4JJavaError: An error occurred while calling o894.csv. : org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 15.0 failed 4 times, most recent failure: Lost task 0.3 in stage 15.0 (TID 73, 11.111.1.11, executor 0): com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400, AWS Service: Amazon S3, AWS Request ID:, AWS Error Code: null, AWS Error Message: Bad Request, S3 Extended Request ID:

标签: amazon-web-services csv apache-spark amazon-s3


【解决方案1】:

好吧,毕竟我能够让它工作,所以我正在回答我自己的问题。

我需要首先更新在运行时传递给 spark-submit 的包。我用的是org.apache.hadoop:hadoop-aws:2.7.3,我把它改成了org.apache.hadoop:hadoop-aws:2.7.7。 其次,我将这些配置传递给 spark 执行器和驱动程序以启用 V4 签名。 --conf spark.hadoop.fs.s3a.endpoint=s3.us-east-2.amazonaws.com --conf spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true --conf spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true

然后 spark-submit 参数看起来像这样(在笔记本中运行时):

os.environ['PYSPARK_SUBMIT_ARGS'] = f"--conf spark.jars.ivy={os.environ['HOME']} --packages org.apache.hadoop:hadoop-aws:2.7.7,com.amazonaws:aws-java-sdk:1.7.4 --conf spark.hadoop.fs.s3a.endpoint=s3.us-east-2.amazonaws.com --conf spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true --conf spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true pyspark-shell"

然后在运行时,我定义了以下配置

hadoopConf = spark.sparkContext._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.endpoint", s3_endpoint_url)
hadoopConf.set("fs.s3a.access.key", s3_access_key_id)
hadoopConf.set("fs.s3a.secret.key", s3_secret_access_key)
hadoopConf.set("fs.s3a.path.style.access", "true")
hadoopConf.set("fs.s3a.connection.ssl.enabled", "true")

最后,在读取文件时,我这样做了:

data = spark.read.csv('s3a://' + s3_bucket + '/data.csv', sep=",", header=True)

我意识到这只发生在我从 us-east-2 区域中的存储桶中读取数据时,并且在 us-east-1 中使用我的问题的配置进行相同操作时,我让它正常工作。总之,密钥实际上是启用 V4 签名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2015-12-04
    • 2017-06-26
    • 1970-01-01
    • 2021-01-20
    相关资源
    最近更新 更多