EMR без сервера с использованием Docker- как установить файлы JAR
Я пытаюсь установить EMR без сервера, для чего у меня есть два варианта.
- Использование сценария Terraform, который позволил мне выбрать начальный размер, максимальный объем памяти и т. д., однако у меня нет возможности установить файлы jar / внешние библиотеки
- Использование образа докера, который не позволяет мне выбрать начальный размер, максимальную память и т. д.
- Я думаю об использовании сценария terraform в докере, однако я не знаю, как установить на него файлы JAR. Может кто-нибудь поделиться мыслями.
Также мои библиотеки внутренние и написаны на JAVA/Scala
ТЮ
Я пробовал докер, а также TF
1 ответ
Во-первых, я думаю, было бы неплохо пояснить, чем EMR Serverless отличается от других вариантов развертывания EMR. EMR Serverless состоит из двух основных компонентов:
- Бессерверное приложение EMR — это тип платформы (Hive/Spark), версия (EMR 6.9.0 / Spark 3.3.0) и свойства приложения, включая архитектуру (x86 или arm64), сеть (VPC или нет), пользовательские образы и рабочие размеры.
- Задания — это конкретный код для вашего задания, включая файлы JAR или зависимости среды выполнения, а также конкретную роль IAM с разрешениями, специфичными для самого задания.
Нет кластера для установки, а инфраструктура (приложение) обычно отделена от отправки задания. Если у вас есть только одна банка, которая является вашей работой, вы должны загрузить ее на S3 и включить в качестве--entrypoint
вашей команде и укажите основной класс с помощью--class
.
aws emr-serverless start-job-run \
--application-id application-id \
--execution-role-arn job-role-arn \
--job-driver '{
"sparkSubmit": {
"entryPoint": "s3://<BUCKET>/jars/spark-examples.jar",
"entryPointArguments": ["1"],
"sparkSubmitParameters": "--class org.co.YourMainClass"
}
}'
Тем не менее, похоже, что вы хотите включить в свою работу дополнительные банки. У вас есть два варианта:
- Создайте собственное изображение , включающее эти банки в путь, включенный Spark, например
/usr/lib/spark
. - Включите банки с отправкой задания , либо загрузив их на S3 и указав путь к ним с помощью параметра, либо, если они доступны в Maven, указав зависимости с помощью параметра.
Для варианта 1, когда вы создаете новое приложение (в котором вы определяете рабочие размеры), вы включаете пользовательское изображение, которое хотите использовать. Например, следующая команда CLI создает приложение с пользовательским образом (--image-configuration
), а также предварительно инициализированную рабочую конфигурацию (--initial-capacity
):
aws emr-serverless create-application \
--release-label emr-6.9.0 \
--type SPARK \
--image-configuration '{
"imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
}' \
--initial-capacity '{
"DRIVER": {
"workerCount": 5,
"workerConfiguration": {
"cpu": "2vCPU",
"memory": "4GB"
}
},
"EXECUTOR": {
"workerCount": 50,
"workerConfiguration": {
"cpu": "4vCPU",
"memory": "8GB"
}
}
}'
Для варианта 2, если у вас есть только один uberjar, который вы хотите использовать в своей работе, вы загружаете его на S3 и предоставляете в качестве точки входа вstart-job-run
команда:
aws emr-serverless start-job-run \
--application-id <APPLICATION_ID> \
--execution-role-arn <JOB_ROLE_ARN> \
--job-driver '{
"sparkSubmit": {
"entryPoint": "s3://<S3_BUCKET>/code/java-spark/java-demo-1.0.jar",
"sparkSubmitParameters": "--class HelloWorld"
}
}'
Если вы хотите указать зависимости maven, вы можете использовать--packages
вsparkSubmitParameters
:
"sparkSubmitParameters": "--packages org.postgresql:postgresql:42.4.0"
Если вы загружаете дополнительные jar-файлы в S3, вы также можете указать их с помощью--jars
вариант.
"sparkSubmitParameters": "--jars s3://<S3_BUCKET>/jars/uber-jar-1.0-SNAPSHOT.jar"
Дополнительную информацию об этих параметрах можно найти в репозитории emr-serverless-samples на GitHub .