Пакет 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, вы можете:
- повышение уровня журнала для отладки для aws и проверка существования заголовка знака s4
- открытие журналов ведра s3 и проверка его записи со знаком s4