Как выполнить упакованную в jar программу scala через Apache Livy на Spark, которая отвечает результатом непосредственно на запрос клиента?
Я намерен добиться, чтобы программа Scala Spark (в jar) получала сообщение POST от клиента, например, curl, принимала некоторые значения аргументов, выполняла некоторую обработку Spark и затем возвращала значение результата вызывающему клиенту. Из доступной документации Apache Livy я не могу найти способ, как я могу вызвать скомпилированную и упакованную программу Spark из клиента (например, curl) через Livy в интерактивном, т.е. сеансовом режиме. Такой сценарий запроса / ответа через Livy может быть выполнен с помощью кода Scala, передаваемого в виде простого текста в оболочку Spark. Но как я могу сделать это с помощью класса Scala в упакованной банке?
curl -k --user "admin:mypassword" -v \
-H "Content-Type: application/json" -X POST \
-d @Curl-KindSpark_ScalaCode01.json \
"https://myHDI-Spark-Clustername.azurehdinsight.net/livy/sessions/0/statements" \
-H "X-Requested-By: admin"
Вместо исходного кода Scala в качестве данных (-d @Curl-KindSpark_ScalaCode01.json
) Я бы предпочел передать путь и имя файла jar-файла, а также значения ClassName и Argument. Но как?
2 ответа
Сделайте uber jar своего приложения Spark с плагином sbt-assembly.
Загрузите файл jar из предыдущего шага в кластер HDFS:
hdfs dfs -put /home/hduser/PiNumber.jar /user/hduser
Выполните свою работу через Ливи:
curl -X POST -d '{"conf": {"kind": "spark" , "jars": "hdfs://localhost:8020/user/hduser/PiNumber.jar"}}' -H "Content-Type: application/json" -H "X-Requested-By: user" localhost:8998/sessions
Проверь это:
curl localhost/sessions/0/statements/3
:
{"id": 3, "state": "available", "output": {"status": "ok", "execute_count":3,"data":{"text/plain":"Pi равно примерно 3.14256"}}}
п.с.
Spark Livy API для Scala/Java требует использования файла Uber JAR. sbt-assembly
не делает толстую банку мгновенно, это меня раздражает. Обычно я использую Python API Livy для тестирования дыма и настройки.
Проверка работоспособности с помощью Python:
curl localhost:sessions/0/statements -X POST -H 'Content-Type: application/json' -d '{"code":"print(\"Sanity check for Livy\")"}'
Вы можете поместить более сложную логику в поле code
, Кстати, именно так работают популярные ноутбуки для Spark - отправка исходного кода в кластер через Livy.
Спасибо, я попробую это. Тем временем я нашел другое решение: $ curl -k --user "admin:" -v -H "Тип содержимого: application / json" -X POST -d @ Curl-KindSpark_BrandSampleModel_SessionSetup.json " https://mycluster.azurehdinsight.net/livy/sessions с файлом JSON, содержащим { "kind": "spark", "jars": ["adl://skylytics1.azuredatalakestore.net/skylytics11/azuresparklivy_2.11-0.1.jar"] } и с загруженным файлом jar в учетной записи Azure Data Lake Gen1, содержащей объект Scala, а затем опубликуйте оператор $ curl -k --user "admin: myPassword" -v -H "Content-Type: application / json" -X POST -d @ Curl-KindSpark_BrandSampleModel_CodeSubmit.json " https://mycluster.azurehdinsight.net/livy/sessions/4/statements" -H "X-Requested-By: admin" с содержимым { "code": "import AzureSparkLivy_GL01._; val brandModelSamplesFirstModel = AzureSparkLivyFunction.SampleModelOfBrand(sc, \"Honda\"); brandModelSamplesFirstModel" }.
Поэтому я сказал Ливи запустить интерактивный сеанс Spark и загрузить указанный jar-файл и передать некоторый код для вызова члена объекта в jar-файле. Оно работает. Также проверим ваш совет.