Как выполнить упакованную в 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-файле. Оно работает. Также проверим ваш совет.

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