Кластер EKS не может получить доступ к файлам s3a при использовании spark-submit. Как это решить?
Я пытаюсь запустить искровое задание на кластере EKS, заставляя его создать 5 рабочих узлов для выполнения этой работы. Все работает отлично, кроме доступа к исполняемому файлу jar в AWS S3, который должен быть запущен. Вот мой код
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: project
namespace: spark
spec:
schedule: "48 15 * * *" #min hour day month week \ will be "00 04 * * *" maybe
jobTemplate:
spec:
template:
spec:
serviceAccountName: spark-service-acc
containers:
- name: project
image: 1234567890.dkr.ecr.us-east-1.amazonaws.com/spark:latest
command: ["/bin/sh",
"-c",
"date && \
cd /opt/spark/jars/ && \
wget http://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.1.1/hadoop-aws-3.1.1.jar && \
wget http://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-core/1.11.396/aws-java-sdk-core-1.11.396.jar && \
cd ~ && \
YESTERDAY=TZ=GMT+24 date +%Y.%m.%d
&& \ / opt / spark / bin / spark-submit \ --deploy-mode k8s: // https://abcdef0123456789.y99.us-east-1.eks.amazonaws.com/ \
--deploy-mode cluster \
--class com.enterprise.project.MainClass \
--conf 'spark.executor.instances=5' \
--conf 'spark.kubernetes.container.image=1234567890.dkr.ecr.us-east-1.amazonaws.com/spark: последний ' \
--conf 'spark.kubernetes.namespace=spark' \
--conf 'spark.kubernetes.authenticate.driver.serviceAccountName=spark-service-acc' \
--conf 'spark.executorEnv.ENVIRONMENT=$(ENVIRONMENT)' \
--conf 'spark.executorEnv.AWS_ACCESS_KEY_ID=$(AWS_ACCESS_KEY_ID)' \
--conf 'spark.executorEnv. $ (ENVIRONMENT)' \
--conf 'spark.kubernetes.driverEnv.AWS_ACCESS_KEY_ID=$(AWS_ACCESS_KEY_ID)' \
--conf 'spark.kubernetes.driverEnv.AWS_SECRET_ACCESS_KEY=$($) \.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem"
--conf 'spark.hadoop.fs.s3a.access.key=$(AWS_ACCESS_KEY_ID)'
--conf 'spark.hadoop.fs.s3a.secret.key=$(AWS_SECRET_ACCESS_KEY)'
--driver-class-path /opt/spark/jars/aws-java-sdk-core-1.11.396.jar
--driver-class-path /opt/spark/jars/hadoop-aws-3.1.1.jar
s3a://abc123/executetable-file.jar \
my-исполняемый-файл-с-3-параметрами $YESTERDAY s3a://abc123 esserver.abc.com:9200 &&
sleep 600"
]
env: # все поля, указанные ниже, должны быть переданы под секретным"env-vars"
- имя: ENVIRONMENT
valueFrom:
secretKeyRef: имя: env-vars ключ: окружение - имя: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef: имя: env-vars ключ: aws-access-key-id
- имя: AWS_SECRET_ACCESS_KEY
valueFrom: nameKeyRR ключ env-vars: ключ aws-secret-access-restartPolicy: никогда
Сообщение об ошибке "Не удалось найти основной на com.enterprise.project.MainClass". Это сообщение происходит, потому что код не может получить доступ к файлу JAR. Я знаю это, потому что код работает, когда я делаю файл jar общедоступным и использую http, чтобы получить файл jar.
Как ни странно, когда исполняемый файл запускается в my-executable-file-with-3-params $YESTERDAY s3a://abc123 esserver.abc.com:9200
где второй аргумент s3a://abc123
это место для записи выходных файлов из исполнения. Эта операция записи работает правильно (когда я использую http для доступа к исполняемому файлу). Эта корзина такая же, как корзина, которая содержит исполняемый файл, к которому, как уже упоминалось, нельзя получить доступ через S3A.
Такое странное поведение может быть вызвано тем, что в исполняемом файле есть jar-файлы hadoop, которые хорошо управляют чтением и записью. Так что это приводит к моим предположениям о том, что конфигурация hadoop / aws почему-то не работает. Я могу подтвердить, что ключ доступа и секретный ключ, заданные в качестве переменных среды, являются правильными, как и имена сегментов.
Теперь, как можно получить доступ к этому файлу JAR? Как я могу устранить эту проблему (возможно, проблема конфигурации hadoop)?