py4jjavaerror使用spark从s3读取csv时出错

bkkx9g8r  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(387)

我试图读取一个csv文件从awss3桶与Spark,目前正在做它通过一个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)

运行该块会向我发送上面的错误。你能帮我解决出什么问题吗?
提前谢谢!

kr98yfug

kr98yfug1#

好吧,我最终还是能成功的,所以我要回答我自己的问题。
我需要首先在运行时更新传递给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)

我意识到,这只发生在我从美国东部-2地区的桶阅读时,在美国东部-1做同样的配置我的问题我得到了正确的工作。总之,关键实际上是启用v4签名。

相关问题