我正在尝试从Spark(在PC上运行)连接到S3存储桶:
val spark = SparkSession
.builder
.appName("S3Client")
.config("spark.master", "local")
.getOrCreate()
val sc = spark.sparkContext;
sc.hadoopConfiguration.set("fs.s3a.access.key", ACCESS_KEY)
sc.hadoopConfiguration.set("fs.s3a.secret.key", SECRET_KEY)
val txtFile = sc.textFile("s3a://bucket-name/folder/file.txt")
val contents = txtFile.collect();
但是出现以下异常:
线程“主”中的异常 com.amazonaws.services.s3.model.AmazonS3Exception:状态码:400, AWS服务:Amazon S3,AWS请求ID:07A7BDC9135BCC84,AWS错误 代码:null,AWS错误消息:错误的请求,S3扩展请求ID: 6ly2vhZ2mAJdQl5UZ / QUdilFFN1hKhRzirw6h441oosGz + PLIvLW2fXsZ9xmd8cuBrNHCdh8UPE =
我见过this question,但对我没有帮助。
编辑:
如Zack所建议,我添加了:
sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3.eu-central-1.amazonaws.com")
但是我仍然遇到同样的异常。
答案 0 :(得分:1)
根据s3 doc,某些区域仅支持“签名版本4”,需要添加以下配置:
--conf "spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true"
和
--conf "spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true"
答案 1 :(得分:0)
Alon,
尝试以下配置:
val spark = SparkSession
.builder
.appName("S3Client")
.config("spark.master", "local")
.getOrCreate()
val sc = spark.sparkContext;
sc.hadoopConfiguration.set("fs.s3a.access.key", ACCESS_KEY)
sc.hadoopConfiguration.set("fs.s3a.secret.key", SECRET_KEY)
sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3.us-east-1.amazonaws.com")
val txtFile = sc.textFile("s3a://s3a://bucket-name/folder/file.txt")
val contents = txtFile.collect();
我相信您的问题是由于您未在配置集中指定端点。将us-east-1
细分为您使用的任何区域。
答案 2 :(得分:0)
我已经解决了问题。
我定位的区域(法兰克福)需要使用签名的第4版。
我已将S3存储桶的区域更改为爱尔兰,现在可以正常使用了。
答案 3 :(得分:0)
这对我有用(这就是所有...不需要其他出口等)
sparkContext._jsc.hadoopConfiguration().set("fs.s3a.access.key", AWS_KEY)
sparkContext._jsc.hadoopConfiguration().set("fs.s3a.secret.key", AWS_SECRET)
sparkContext._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.us-east-2.amazonaws.com")
运行:
spark-submit --conf spark.driver.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4' --conf spark.executor.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4' --packages org.apache.hadoop:hadoop-aws:2.7.1 spark_read_s3.py