我的spark(2.4.0)批处理将数据写入s3,好像它使用aws s3 sign v2,随着AWS要求移动到v4 sign(https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html),需要更改
为此,我们需要执行以下操作:
1-当我们像
初始化spark conf时添加aws.s3.endpoint val hadoopConfiguration = sparkSession.sparkContext.hadoopConfiguration
hadoopConfiguration.set("fs.s3a.access.key",xxx)
hadoopConfiguration.set("fs.s3a.secret.key",yyy)
hadoopConfiguration.set("fs.s3a.endpoint", "s3.us-east-1.amazonaws.com")
2-强制使用sign4
System.setProperty(SDKGlobalConfiguration.ENFORCE_S3_SIGV4_SYSTEM_PROPERTY,“ true”)
3-我将Aws客户端升级到1.11以上
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.199</version>
在使用kubernetes部署spark作业之后,任务运行并将数据写入s3,但是它崩溃并返回错误,表明AWS符号不匹配
我打开s3存储桶日志并搜索错误,我的最佳猜测是在上传文件后,执行程序发生崩溃,另一位执行程序尝试上传同一文件,他使用v4进行了签名,但该标志确实不匹配(可能时间戳不相等)
从阅读中了解到我需要将spark升级到Hadoop 3.2,该怎么做?好吧,我做到了,想分享一些步骤,以帮助他人:
解决方案:
需要完成的步骤:
为了使用hadoop 3.2编译spark
1)从github下载spark源
2)我使用标签v2.4.0,因为主版本在kubernetes上无法正常工作
3)在hadoop配置文件部分的pom文件中添加新的配置文件
<profile>
<id>hadoop-3.2</id>
<properties>
<hadoop.version>3.2.0</hadoop.version>
<curator.version>2.12.0</curator.version>
<zookeeper.version>3.4.9</zookeeper.version>
</properties>
</profile>
4)运行-> ./build/mvn -Pyarn -Phadoop-3.2 -Dhadoop.version = 3.2.0 -DskipTests清理程序包
5)运行-> ./dev/make-distribution.sh --name fyber-spark --tgz -Phadoop-3.2 -Dhadoop.version = 3.2.0 -Pkubernetes
现在您将拥有可使用Hadoop 3.2的spark 2.4.0
6)当我使用kubernetes时,我还需要修改dockerfile
添加->
ENV AMAZON_SDK_VERSION=1.11.199
ENV HADOOP_AWS_VERSION=3.2.0
# adding s3a support
RUN wget http://central.maven.org/maven2/com/amazonaws/aws-java-sdk/${AMAZON_SDK_VERSION}/aws-java-sdk-${AMAZON_SDK_VERSION}.jar -P /tmp \
&& wget http://central.maven.org/maven2/org/apache/hadoop/hadoop-aws/${HADOOP_AWS_VERSION}/hadoop-aws-${HADOOP_AWS_VERSION}.jar -P /tmp
RUN cp /tmp/aws-java-sdk-${AMAZON_SDK_VERSION}.jar /opt/spark/jars \
&& cp /tmp/hadoop-aws-${HADOOP_AWS_VERSION}.jar /opt/spark/jars
确保您拥有“ nss”
RUN set -ex && \
apk upgrade --no-cache && \
apk add --no-cache bash tini libc6-compat linux-pam nss && \
mkdir -p /opt/spark && \
mkdir -p /opt/spark/work-dir && \
touch /opt/spark/RELEASE && \
rm /bin/sh && \
ln -sv /bin/bash /bin/sh && \
echo "auth required pam_wheel.so use_uid" >> /etc/pam.d/su && \
chgrp root /etc/passwd && chmod ug+rw /etc/passwd
现在您就可以提交spark作业了,它支持带有s4标志的s3a, 确保它支持v4,您可以: