AWS S3 (ap-south-1) 为 Hudi DeltaStreamer 作业返回错误请求

问题描述

我正在尝试使用以下 cmd 运行 DeltaStreamer 作业以将数据推送到 S3 存储桶:

spark-submit  \
    --packages com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.3 \
    --conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem \
    --conf spark.hadoop.fs.s3a.endpoint=s3.ap-south-1.amazonaws.com \
    --conf spark.hadoop.fs.s3a.access.key='AA..AA' \
    --conf spark.hadoop.fs.s3a.secret.key='WQO..IOEI' \
    --class org.apache.hudi.utilities.deltastreamer.HoodieDeltaStreamer $HUDI_UTILITIES_BUNDLE \
    --table-type copY_ON_WRITE \
    --source-class org.apache.hudi.utilities.sources.JsonKafkaSource \
    --source-ordering-field cloud.account.id \
    --target-base-path s3a://test \
    --target-table test1_cow \
    --props /var/demo/config/kafka-source.properties \
    --hoodie-conf hoodie.datasource.write.recordkey.field=cloud.account.id \
    --hoodie-conf hoodie.datasource.write.partitionpath.field=cloud.account.id \
    --schemaprovider-class org.apache.hudi.utilities.schema.FilebasedSchemaProvider

这将返回以下错误

Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400,AWS Service: Amazon S3,AWS Request ID: 9..1,AWS Error Code: null,AWS Error Message: Bad Request,S3 Extended Request ID: G..g=
    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:297)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
    ...

我想我使用的是正确的 S3 端点。我是否需要创建 S3 接入点? 我正在关注 https://hudi.apache.org/docs/docker_demo.html (https://github.com/apache/hudi/tree/master/docker) 中提到的版本。

解决方法

该 AWS 区域仅适用于 v4 签名,因此您必须将端点设置为该区域。

但是:那个版本的 hadoop-* JAR 和 AWS SDK 不处理通过 fs.s3a.endpoint 选项设置端点,毕竟它已经四年了 - 在任何仅 v4 的 AWS 区域之前启动。

将hadoop版本升级为最近2-3年写的东西。我的建议是 Hadoop 3.3.1 或 3.2.2。

即:

  1. 所有 hadoop-* JAR,而不仅仅是单个 JAR。尝试升级 hadoop-aws.jar 只会给你新的堆栈跟踪。
  2. 以及匹配的 sdk 包 JAR。 Mvn repo 显示您需要的版本。

最简单的方法是访问 hadoop.apache.org,下载整个版本,然后解压缩 jar。