问题描述
我正在尝试使用以下 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。
即:
- 所有 hadoop-* JAR,而不仅仅是单个 JAR。尝试升级 hadoop-aws.jar 只会给你新的堆栈跟踪。
- 以及匹配的 sdk 包 JAR。 Mvn repo 显示您需要的版本。
最简单的方法是访问 hadoop.apache.org,下载整个版本,然后解压缩 jar。