Как выполнить упакованную в jar программу scala через Apache Livy на Spark, которая отвечает результатом непосредственно на запрос клиента? - PullRequest
0 голосов
/ 06 января 2019

Чего я хочу добиться, так это чтобы программа Scala Spark (в банке) получила сообщение 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 ]

0 голосов
/ 08 января 2019

Спасибо, я попробую это. Тем временем я нашел другое решение: $ curl -k --user "admin:" -v -H "Тип содержимого: application / json" -X POST -d @ Curl-KindSpark_BrandSampleModel_SessionSetup.json "https://mycluster.azurehdinsight.net/livy/sessions с файлом JSON, содержащим { "вид": "искра", "баночки": ["adl: //skylytics1.azuredatalakestore.net/skylytics11/azuresparklivy_2.11-0.1.jar"] } и с загруженным файлом jar в учетной записи Azure Data Lake Gen1, содержащей объект Scala, а затем опубликуйте оператор $ curl -k --user "admin: myPassword" -v -H "Тип содержимого: application / json" -X POST -d @ Curl-KindSpark_BrandSampleModel_CodeSubmit.json "https://mycluster.azurehdinsight.net/livy/sessions/4/statements" -H" X-Requested- Автор: admin " с содержанием { "code": "import AzureSparkLivy_GL01._; val brandModelSamplesFirstModel = AzureSparkLivyFunction.SampleModelOfBrand (sc, \" Honda \ "); brandModelSamplesFirstModel" }.

Итак, я сказал Ливи начать интерактивный сеанс Spark и загрузить указанный jar-файл и передал некоторый код для вызова члена объекта в jar-файле. Оно работает. Также проверю ваш совет.

0 голосов
/ 07 января 2019
  • Создайте uber jar для своего приложения Spark с помощью sbt-assembly .

  • Загрузить файл jar из предыдущего шага в кластер HDFS: hdfs dfs -put /home/hduser/PiNumber.jar /user/hduser

  • Выполните свою работу с помощью livy: 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, "состояние": "доступен", "Выход": { "Статус": "хорошо", "execution_count": 3, "данные": { "текст / обычный": "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.

...