Py4JJavaError使用Spark从S3读取csv时出现错误



我正在尝试使用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)

运行该块会给我发送上面的错误。你能告诉我哪里出了问题吗?

提前感谢!

好吧,我终于能让它工作了,所以我在回答我自己的问题。

我需要在运行时首先更新传递给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签名。

最新更新