我正在尝试从 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();
但出现以下异常:
线程“main”中的异常 com.amazonaws.services.s3.model.AmazonS3Exception:状态代码:400, AWS 服务:Amazon S3,AWS 请求 ID:07A7BDC9135BCC84,AWS 错误 代码:null,AWS 错误消息:错误请求,S3 扩展请求 ID: 6ly2vhZ2mAJdQl5UZ/QUdilFFN1hKhRzirw6h441oosGz+PLIvLW2fXsZ9xmd8cuBrNHCdh8UPE=
我看过这个问题,但它对我没有帮助。
编辑:
按照扎克的建议,我补充道:
sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3.eu-central-1.amazonaws.com")
但我仍然遇到同样的异常。
我已经解决了问题。
我的目标是需要使用签名版本 4 的地区(法兰克福)。
我已将 S3 存储桶的区域更改为爱尔兰,现在它可以正常工作了。
根据s3 doc,部分地区仅支持“Signature Version(s) 4”,需要添加以下配置:
--conf "spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true"
和
--conf "spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true"
阿隆,
尝试以下配置:
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
替换为您使用的任何区域。
这对我有用(这就是一切......不需要其他导出等)
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
就我而言。正如我所拥有的那样
.config("spark.hadoop.fs.s3.impl","org.apache.hadoop.fs.s3a.S3AFileSystem")
我还必须使用“s3a:”而不是“s3”来启动 s3 路径