Spark with AWS Sign v4问题

时间:2019-05-12 05:50:13

标签: amazon-web-services amazon-s3

我的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,您可以:

  1. 增加日志级别以调试AWS并验证s4标志头是否存在
  2. 打开s3存储桶日志并验证它是否带有s4符号

0 个答案:

没有答案