Amazon web services Amazon s3a使用Spark返回400个错误请求

Amazon web services Amazon s3a使用Spark返回400个错误请求,amazon-web-services,amazon-s3,apache-spark,hdfs,spark-streaming,Amazon Web Services,Amazon S3,Apache Spark,Hdfs,Spark Streaming,出于签出目的,我尝试将AmazonS3 bucket设置为检查点文件 val checkpointDir = "s3a://bucket-name/checkpoint.txt" val sc = new SparkContext(conf) sc.setLocalProperty("spark.default.parallelism", "30") sc.hadoopConfiguration.set("fs.s3a.access.key", "xxxxx") sc.hadoopConfigu

出于签出目的,我尝试将AmazonS3 bucket设置为检查点文件

val checkpointDir = "s3a://bucket-name/checkpoint.txt"
val sc = new SparkContext(conf)
sc.setLocalProperty("spark.default.parallelism", "30")
sc.hadoopConfiguration.set("fs.s3a.access.key", "xxxxx")
sc.hadoopConfiguration.set("fs.s3a.secret.key", "xxxxx")
sc.hadoopConfiguration.set("fs.s3a.endpoint", "bucket-name.s3-website.eu-central-1.amazonaws.com")
val ssc = new StreamingContext(sc, Seconds(10))
ssc.checkpoint(checkpointDir)
但只有这个例外

Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400, AWS Service: Amazon S3, AWS Request ID: 9D8E8002H3BBDDC7, AWS Error Code: null, AWS Error Message: Bad Request, S3 Extended Request ID: Qme5E3KAr/KX0djiq9poGXPJkmr0vuXAduZujwGlvaAl+oc6vlUpq7LIh70IF3LNgoewjP+HnXA=
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:798)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:421)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:232)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3528)
at com.amazonaws.services.s3.AmazonS3Client.headBucket(AmazonS3Client.java:1031)
at com.amazonaws.services.s3.AmazonS3Client.doesBucketExist(AmazonS3Client.java:994)
at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:154)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2596)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2630)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2612)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
at org.apache.spark.streaming.StreamingContext.checkpoint(StreamingContext.scala:232)
at com.misterbell.shiva.StreamingApp$.main(StreamingApp.scala:89)
at com.misterbell.shiva.StreamingApp.main(StreamingApp.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:664)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:169)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:192)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:111)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我不明白为什么会出现此错误,也找不到任何示例。

此消息对应于“坏端点”或坏签名版本支持之类的内容

正如所见,法兰克福是唯一一个不支持签名版本2的城市。我想这是我选的

当然,毕竟我的研究不能说明什么是签名版本,在文档中它并不明显。但是V2似乎与s3a配合使用

S3接口中的端点不是真正的端点,只是web端点

您必须使用一次这样的端点
sc.hadoopConfiguration.set(“fs.s3a.endpoint”、“s3.eu-west-1.amazonaws.com”)


但是默认情况下,它与US endpoint一起工作

此消息对应于“坏端点”或坏签名版本支持之类的内容

正如所见,法兰克福是唯一一个不支持签名版本2的城市。我想这是我选的

当然,毕竟我的研究不能说明什么是签名版本,在文档中它并不明显。但是V2似乎与s3a配合使用

S3接口中的端点不是真正的端点,只是web端点

您必须使用一次这样的端点
sc.hadoopConfiguration.set(“fs.s3a.endpoint”、“s3.eu-west-1.amazonaws.com”)


但是,默认情况下,US endpoint可以使用它

如果您想在spark中使用支持签名V4的区域,您可以在运行时将flag
-Dcom.amazonaws.services.s3.enableV4
传递给驱动程序选项和执行器选项。例如:

spark-submit --conf spark.driver.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4' \
    --conf spark.executor.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4' \
    ... (other spark options)

使用此设置,Spark能够写入法兰克福(以及其他仅V4版本的地区),即使AWS sdk版本不太新(
com.amazonaws:AWS java sdk:1.7.4

如果您想使用spark中支持签名V4的区域,可以在运行时将flag
-Dcom.amazonaws.services.s3.enableV4
传递给驱动程序选项和执行器选项。例如:

spark-submit --conf spark.driver.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4' \
    --conf spark.executor.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4' \
    ... (other spark options)

通过此设置,Spark能够写入法兰克福(以及其他仅V4的地区),即使AWS sdk版本不太新(
com.amazonaws:AWS java sdk:1.7.4

在本地运行Spark时,我也遇到了同样的问题,原因是SIGV4没有设置,此代码帮助了我:

import com.amazonaws.SDKGlobalConfiguration
System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true")

在本地运行spark时,我遇到了同样的问题,原因是没有设置SIGV4,以下代码帮助了我:

import com.amazonaws.SDKGlobalConfiguration
System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true")

我可以确认不同的aws地区使用不同版本的例如sha256。因此,我们应该尝试使用最新的兼容版本,例如aws java sdkI,它可以确认不同的aws地区使用不同的版本,例如sha256。因此,应该尝试使用最新的兼容版本,例如aws java sdkWhich Spark版本?2.4?是的,我在2.4.3中使用过,只是我自己也尝试过,但是有一些其他问题,我想知道你是否在2.4中尝试过。现在它对我也有效。谢谢尝试使用Spark 2.4.5时,我必须同时执行此操作和@crak的回复,才能让Spark阅读区域ap-south-1的文件。他们中的任何一个人都是不够的。正在使用
com.amazonaws:aws java sdk:1.7.4
。这为我节省了
%spark.conf spark.jars/spark-additional jars/spark-avro_2.11-2.4.3.jar、/spark additional jars/hudi-spark-bundle_2.11-0.6.0.jar、/spark additional jars/hadoop-aws-2.7.3.jar,/spark additional jars/hadoop-common-2.7.3.jar,/spark additional jars/aws-java-sdk-1.7.4.jar spark.serializer org.apache.spark.serializer.KryoSerializer spark.executor.extraJavaOptions-Dcom.amazonaws.services.s3.enableV4
extraJavaOptions-我们的救星哪个spark版本?2.4?是的,我在2.4.3中使用过,只是我自己也尝试过,但是有一些其他问题,我想知道你是否在2.4中尝试过。现在它对我也有效。谢谢尝试使用Spark 2.4.5时,我必须同时执行此操作和@crak的回复,才能让Spark阅读区域ap-south-1的文件。他们中的任何一个人都是不够的。正在使用
com.amazonaws:aws java sdk:1.7.4
。这为我节省了
%spark.conf spark.jars/spark-additional jars/spark-avro_2.11-2.4.3.jar、/spark additional jars/hudi-spark-bundle_2.11-0.6.0.jar、/spark additional jars/hadoop-aws-2.7.3.jar,/spark additional jars/hadoop-common-2.7.3.jar,/spark additional jars/aws-java-sdk-1.7.4.jar spark.serializer org.apache.spark.serializer.KryoSerializer spark.executor.extraJavaOptions-Dcom.amazonaws.services.s3.enableV4
extraJavaOptions-我们的救世主