Мое требование: из веб-приложения запускайте задание Spark в Yarn и отображайте результат обратно на веб-странице. Задание spark принимает несколько аргументов и вычисляет DataSet со значениями, которые необходимо вернуть в веб-приложение.
Покопавшись в Интернете, я решил, что для этого можно использовать Livy.
Ливи уже был установлен с HDP 2.5. Поэтому я создал новый сеанс Livy, используя POST/Sessions и включив в него файл jar.
{"kind":"spark","name":"livy","jars":["/xyz.jar"],"proxyUser":"livy"}
(Мне пришлось включить заголовок «x-requested-by», так как csrfPrevention был включен.) Примечание. Чтобы это работало, банку нужно было поместить в HDFS.
Согласно примерам Ливи: - https://livy.apache.org/examples/ Я могу передавать фрагменты кода как "data = {'code': '1 + 1'}" Я не понимаю, как я могу вызвать метод в своем классе. У меня нет параметра «className» в соответствии с документацией API Livy Rest — https://livy.apache.org/docs/latest/rest-api.html
Если я использую POST/Batch для создания сеанса, я могу указать банку и свой основной класс. Но, делая это таким образом, я не верну свой результат в свое веб-приложение.
Код Java в моем файле jar:
public class LivySample {
public String executeSampleLivy(SparkContext sc,String input){
JavaSparkContext jsc = new JavaSparkContext(sc);
List<String> listNames = Arrays.asList("abc","def","ghi");
JavaRDD<String> rdd = jsc.parallelize(listNames);
return rdd.filter(l->l.contains(input)).collect().get(0);
}
}
Я попытался запустить приведенный ниже код как POST на URL-адресе Livy - session/20/statements '''
{
"code": "import LivySample;LivySample lv = new LivySample();lv.executeSampleLivy(sc, \"abc\")"
}
Ошибка, которую я получил при вызове сеансов GET/21/statements/0:
{
"id": 2,
"state": "available",
"output": {
"status": "error",
"execution_count": 2,
"ename": "Error",
"evalue": "<console>:1: error: '.' expected but ';' found. import LivySample;LivySample lv = new LivySample();lv.executeSampleLivy(sc, "chris"); ^",
"traceback": [],
}
}
Я не могу отладить эту ошибку. Не могли бы вы сообщить мне, что я делаю неправильно здесь.
Могу ли я использовать Java в LivyRest API, как я указал здесь.
Благодарность!
1 ответ
Я больше знаком с API пакетов, но я считаю, что в API сеанса JAR вашего приложения должен быть указан в поле запроса files
, а не jars
(как это ни парадоксально).
В любом случае, сеанс Livy — это, по сути, интерактивный сеанс искровой оболочки. Поэтому, если вы хотите использовать сеансы, вы должны выполнять свою программу построчно (отправляя запрос в конечную точку RunStatement
для каждой строки). Затем, в конце, вы запросите результат у конечной точки GetSessionStatement(s)
.
В качестве альтернативы (и, возможно, более простого) вы можете использовать пакетный API, просто записать вывод в какое-то постоянное место и сделать так, чтобы ваше веб-приложение открывало его, когда пакет достигает состояния «УСПЕХ».
Похожие вопросы
Новые вопросы
apache-spark
Apache Spark - это механизм распределенной обработки данных с открытым исходным кодом, написанный на Scala, предоставляющий пользователям унифицированный API и распределенные наборы данных как для пакетной, так и для потоковой обработки. Варианты использования Apache Spark часто связаны с машинным / глубоким обучением и обработкой графиков.