Как отправить задания Spark в кластер EMR из Airflow?

Как я могу установить связь между главным кластером EMR (созданным Terraform) и Airflow. У меня есть настройка Airflow под сервером AWS EC2 с теми же SG,VPC и Subnet.

Мне нужны решения, чтобы Airflow мог общаться с EMR и выполнять отправку Spark.

https://aws.amazon.com/blogs/big-data/build-a-concurrent-data-orchestration-pipeline-using-amazon-emr-and-apache-livy/

У этих блогов есть понимание выполнения после того, как соединение было установлено (не очень помогло)

В потоке воздуха я установил соединение, используя интерфейс для 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

  1. использование Apache Livy

    • Это решение фактически не зависит от удаленного сервера, т.е. EMR
    • Вот пример
    • Недостатком является то, что Livy находится на ранних стадиях и его API кажется неполным и шатким для меня
  2. использование EmrStepsAPI

    • Зависит от удаленной системы: EMR
    • Надежный, но поскольку он по своей сути асинхронный, вам также потребуется EmrStepSensor (наряду с EmrAddStepsOperator)
    • На одном EMR кластер, вы не можете иметь более одного шага одновременно (хотя существуют некоторые хакерские обходные пути)
  3. использование SSHHook / SSHOperator

    • Опять не зависит от удаленной системы
    • Сравнительно легче начать с
    • Если твой spark-submit Команда включает в себя много аргументов, сборка этой команды (программно) может стать громоздкой

EDIT-1

Кажется, есть еще один простой способ

  1. Указание удаленного master -IP

    • Независимо от удаленной системы
    • Требуется изменение глобальных конфигураций / переменных среды
    • Подробности смотрите в ответе @cricket_007

Полезные ссылки

Поскольку вы создали EMR, используя Terraform, вы получаете основной IP как aws_emr_cluster.my-emr.master_public_dns

Надеюсь это поможет.

Другие вопросы по тегам