Искра с выпуском знака v4 v4 - PullRequest
1 голос
/ 12 мая 2019

Пакет My spark (2.4.0) записывает данные в s3, похоже, что он использует aws s3 sign v2, который необходимо изменить, поскольку Aws требуется для перехода к знаку v4 (https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)

чтобы сделать это, нам нужно сделать следующее:

1 - добавить aws.s3.endpoint, когда мы инициализируем spark conf, как

 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, задачизаписал данные в s3, но он вылетает и возвращает ошибку о том, что знак Aws не совпадает

Я открываю журналы ведра s3 и ищу ошибку, и я думаю, что после загрузки файла происходит сбой в исполнителеи другой исполнитель пытается загрузить тот же файл, и он подписывает его с v4, но знак не совпадает (возможно, отметка времени не равна)

от чтения, я понимаю, что мне нужно обновить спарк до Hadoop 3.2, какв Это?Ну, я сделал это и хотел поделиться шагами, чтобы помочь другим:

Решение:

Шаги, которые нужно было сделать:

, чтобы скомпилировать spark с hadoop 3.2

1) Скачать источник искры с github

2) Я использовал тег v2.4.0, так как мастер-версия не работала хорошо на kubernetes

3) Добавить в файл pom новый профиль в разделе профилей hadoop

 <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

теперь у вас будет Spark 2.4.0 с готовым к использованию Hadoop 3.2

6), так как я использую kubernetes, мне также нужно было изменить файл dockerfile

Add ->

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

Это все, что вы можете отправить на работу, и поддерживает s3a со знаком s4, чтобы убедиться, что он поддерживает v4, вы можете:

  1. повышение уровня журнала для отладки для aws и проверка существования заголовка знака s4
  2. открытие журналов ведра s3 и проверка его записи со знаком s4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...