我试图读取一个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)
运行该块会向我发送上面的错误。你能帮我解决出什么问题吗?
提前谢谢!
1条答案
按热度按时间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参数如下所示(在笔记本中运行时):然后在运行时,我定义了以下配置
最后,在读取文件时,我做了以下操作:
我意识到,这只发生在我从美国东部-2地区的桶阅读时,在美国东部-1做同样的配置我的问题我得到了正确的工作。总之,关键实际上是启用v4签名。