Как отправить задания Spark в кластер EMR из Airflow?
Как я могу установить связь между главным кластером EMR (созданным Terraform) и Airflow. У меня есть настройка Airflow под сервером AWS EC2 с теми же SG,VPC и Subnet.
Мне нужны решения, чтобы Airflow мог общаться с EMR и выполнять отправку Spark.
У этих блогов есть понимание выполнения после того, как соединение было установлено (не очень помогло)
В потоке воздуха я установил соединение, используя интерфейс для AWS и EMR:-
Ниже приведен код, который будет перечислять кластеры EMR, которые являются активными и прекращенными, я также могу настроить активные кластеры: -
from airflow.contrib.hooks.aws_hook import AwsHook
import boto3
hook = AwsHook(aws_conn_id=‘aws_default’)
client = hook.get_client_type(‘emr’, ‘eu-central-1’)
for x in a:
print(x[‘Status’][‘State’],x[‘Name’])
У меня вопрос - Как я могу обновить свой код выше, можно выполнить действия Spark-submit
2 ответа
Хотя он может не отвечать непосредственно на ваш конкретный запрос, в целом, вот несколько способов, которыми вы можете вызвать spark-submit
на (дистанционном) EMR
с помощью Airflow
использование
Apache Livy
- Это решение фактически не зависит от удаленного сервера, т.е.
EMR
- Вот пример
- Недостатком является то, что
Livy
находится на ранних стадиях и егоAPI
кажется неполным и шатким для меня
- Это решение фактически не зависит от удаленного сервера, т.е.
использование
EmrSteps
API
- Зависит от удаленной системы:
EMR
- Надежный, но поскольку он по своей сути асинхронный, вам также потребуется
EmrStepSensor
(наряду сEmrAddStepsOperator
) - На одном
EMR
кластер, вы не можете иметь более одного шага одновременно (хотя существуют некоторые хакерские обходные пути)
- Зависит от удаленной системы:
использование
SSHHook
/SSHOperator
- Опять не зависит от удаленной системы
- Сравнительно легче начать с
- Если твой
spark-submit
Команда включает в себя много аргументов, сборка этой команды (программно) может стать громоздкой
EDIT-1
Кажется, есть еще один простой способ
Указание удаленного
master
-IP- Независимо от удаленной системы
- Требуется изменение глобальных конфигураций / переменных среды
- Подробности смотрите в ответе @cricket_007
Полезные ссылки
Поскольку вы создали EMR, используя Terraform, вы получаете основной IP как aws_emr_cluster.my-emr.master_public_dns
Надеюсь это поможет.