Работа с 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 позволяет заменить имя пользователя и запустить процесс от имени другого пользователя.
Чтобы включить имперсонацию, выполните следующие действия:
-
В разделе настроек ADCM <YourClusterName> → Services → HDFS → Custom core-site.xml укажите свойства
hadoop.proxyuser.livy.groups = *
иhadoop.proxyuser.livy.hosts = *
. Разрешение всех групп/хостов (*
) является плохой практикой с точки зрения безопасности и используется только для демонстрационного примера. -
Убедитесь, что файл /etc/livy/conf/livy.conf (находится на том же хосте, где установлен сервер Livy) содержит параметр
livy.impersonation.enabled = True
. -
Выполните рестарт сервисов HDFS, YARN и Spark.
-
Если включен плагин Ranger, необходимо добавить соответствующие политики для пользователя
livyDemoUser
, который фигурирует в примерах.
Пример создания сессии
Ниже показан пример создания новой сессии (Batch), которая запускает задачу SparkPi:
-
Создайте 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. -
Отправьте 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.


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


Просмотр статуса сессии
Для получения статуса 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.