Работа с Livy

Apache Livy — это компонент сервиса Spark/Spark3, позволяющий взаимодействовать с кластером Spark через HTTP. Livy предоставляет REST API, с помощью которого можно вызывать функции Spark, например:

  • создание Spark-задачи;

  • синхронное/асинхронное получение результатов;

  • управление Spark Context.

Данный раздел демонстрирует основные операции с Livy, такие как создание/просмотр/удаление сессии, а также содержит информацию об использовании имперсонации в Livy. Все примеры в данном разделе относятся к типу сессий Batch, однако REST API для работы с интерактивными (Interactive) сессиями очень схож. Batch-сессии предназначены для асинхронного, неинтерактивного выполнения Spark-задач и создаются автоматически при запуске приложения в batch-режиме.

Больше подробной информации доступно на странице Apache Livy REST API.

РЕКОМЕНДАЦИЯ
Рекомендуется использовать сервер Livy, поставляемый с сервисом Spark3. Такой сервер использует порт 8999 и содержит последние исправленные баги. Сервер же Livy, который устанавливается вместе с сервисом Spark, использует порт 8998 и не содержит последних исправлений.

Требования к кластеру

Для выполнения примеров, представленных в этом разделе, необходимо подготовить кластер ADH.

Добавление прав доступа

Сначала добавьте необходимые права доступа директориям Hadoop и скопируйте JAR-файлы с примерами Spark в HDFS.

$ sudo -u hdfs hdfs dfs -mkdir /user/livyDemoUser
$ sudo -u hdfs hdfs dfs -chown livyDemoUser:hadoop /user/livyDemoUser
$ sudo -u hdfs hdfs dfs -chmod -R a+rwx /user/livyDemoUser
$ sudo -u hdfs hdfs dfs -chmod -R a+rwx /var/log/spark/apps
$ sudo -u hdfs hdfs dfs -mkdir /user/livyDemoUser/spark_examples
$ sudo -u hdfs hdfs dfs -put /usr/lib/spark/examples/jars/* /user/livyDemoUser/spark_examples

Активация имперсонации в Livy

Когда Livy получает HTTP-запрос и создает новую задачу YARN/Spark, то по умолчанию новый процесс задачи запускается под пользователем livy. Имперсонация Livy позволяет заменить имя пользователя и запустить процесс от имени другого пользователя. Чтобы включить имперсонацию, выполните следующие действия:

  1. В разделе настроек ADCM <YourClusterName> → Services → HDFS → Custom core-site.xml укажите свойства hadoop.proxyuser.livy.groups = * и hadoop.proxyuser.livy.hosts = *. Разрешение всех групп/хостов (*) является плохой практикой с точки зрения безопасности и используется только для демонстрационного примера.

  2. Убедитесь, что файл /etc/livy/conf/livy.conf (находится на том же хосте, где установлен сервер Livy) содержит параметр livy.impersonation.enabled = True.

  3. Выполните рестарт сервисов HDFS, YARN и Spark.

  4. Если включен плагин Ranger, необходимо добавить соответствующие политики для пользователя livyDemoUser, который фигурирует в примерах.

Пример создания сессии

Ниже показан пример создания новой сессии (Batch), которая запускает задачу SparkPi:

  1. Создайте JSON-файл, который будет отправлен на сервер Livy в теле запроса HTTP.

    {
        "file": "/user/livyDemoUser/spark_examples/spark-examples_2.11-2.3.2.3.1.0.15-1.jar", (1)
        "className": "org.apache.spark.examples.SparkPi", (2)
        "name": "test-livy-1", (3)
        "args": [10], (4)
        "proxyUser": "livyDemoUser" (5)
    }
    1 Путь к JAR-файлу с примером Spark.
    2 Основной класс приложения SparkPi.
    3 Имя новой сессии. Имя должно быть уникальным для всего кластера.
    4 Список аргументов командной строки, передаваемых приложению Spark.
    5 Имя пользователя для имперсонации. От этого пользователя будет запущен новый процесс задачи Spark.
  2. Отправьте POST-запрос для создания новой batch-сессии.

    $ curl -X POST 'http://<livyServerHost>:8999/batches'
    -H "X-Requested-By: livyDemoUser" (1)
    -d @request.json -H 'Content-Type: application/json'
    1 Обязательный HTTP-заголовок, необходимый для CSRF-защиты
    ПРИМЕЧАНИЕ
    Если ваш кластер ADH керберизирован, необходимо активировать механизм SPNEGO для curl. Для этого добавьте флаг --negotiate -v -u: к вашим запросам curl.

    Ответ от Livy-сервера имеет следующий вид:

    {"id":1,"name":"test-livy-2","state":"starting","appId":null,"appInfo":{"driverLogUrl":null,"sparkUiUrl":null},"log":["stdout: ","\nstderr: ","\nYARN Diagnostics: "]}

Получив запрос, Livy создает новую сессию с именем test-livy-1 (значение поля name в request.json). Новая сессия отображается в интерфейсе Livy.

result job livyui
Новая сессия в Livy UI
result job livyui dark
Новая сессия в Livy UI

Также новая сессия видна в интерфейсе YARN(UI2).

result job yarn
Новая сессия в YARN
result job yarn dark
Новая сессия в YARN

Просмотр статуса сессии

Для получения статуса batch-сессии выполните следующий запрос.

$ curl -X GET 'http://<livyServerHost>/batches/x'

Где x — это ID сессии, например 123. Полученный ответ имеет следующий вид:

{"id":2,"name":"test-livy-4","state":"starting","appId":null,"appInfo":{"driverLogUrl":null,"sparkUiUrl":null},"log": [...]}

Для получения списка всех сессий выполните следующий запрос.

$ curl -X GET 'http://<livyServerHost>/batches'

Ответ содержит список всех сессий, например:

{"from":0,"total":4,"sessions":[{"id":0,"name":"test-livy-1","state":"finished","appId":null,"appInfo":{"driverLogUrl":null,"sparkUiUrl":null},"log":[...]},...]}

Удаление сессии

Чтобы удалить batch-сессию, выполните следующий запрос.

$ curl -X DELETE 'http://<livyServerHost>:8999/batches/x'
-H 'X-Requested-By: livyDemoUser'

Где x — это ID batch-сессии, которую нужно удалить.

Частые проблемы

Ниже описаны наиболее частые проблемы, с которыми вы можете столкнуться при работе с Livy:

  • Ошибка имперсонации.

    Вы можете увидеть следующую ошибку в логах Livy:

    org.apache.hadoop.security.authorize.AuthorizationException: User: livy is not allowed to impersonate <username> ...

    Данная ошибка сигнализирует о некорректной настройке имперсонации. Подробности настройки описаны в секции Активация имперсонации в Livy.

  • Ошибка HTTP ERROR: 400 в ответе curl.

    Данная ошибка говорит об отсутствии обязательного HTTP-заголовка для защиты от CSRF. Добавьте заголовок (-H "X-Requested-By: <userName>") при отправке запросов curl.

  • Ошибки, связанные с политиками Ranger.

    Если плагин Ranger включен, пользователь не может создавать новые сессии в дефолтной очереди YARN. Для корректной работы необходимо добавить соответствущие политики Ranger для YARN.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней