Мое требование: из веб-приложения запускайте задание 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, как я указал здесь.

Благодарность!

0
Chris 30 Мар 2020 в 05:29

1 ответ

Я больше знаком с API пакетов, но я считаю, что в API сеанса JAR вашего приложения должен быть указан в поле запроса files, а не jars (как это ни парадоксально).

В любом случае, сеанс Livy — это, по сути, интерактивный сеанс искровой оболочки. Поэтому, если вы хотите использовать сеансы, вы должны выполнять свою программу построчно (отправляя запрос в конечную точку RunStatement для каждой строки). Затем, в конце, вы запросите результат у конечной точки GetSessionStatement(s).

В качестве альтернативы (и, возможно, более простого) вы можете использовать пакетный API, просто записать вывод в какое-то постоянное место и сделать так, чтобы ваше веб-приложение открывало его, когда пакет достигает состояния «УСПЕХ».

0
user4601931 1 Апр 2020 в 21:53
Спасибо за ваш ответ.
 – 
Chris
1 Апр 2020 в 22:19
Я пытаюсь, как вы предложили. Сначала я создаю сеанс, затем запрашиваю сеанс и создаю оператор для этого идентификатора сеанса. При создании оператора мне нужно будет предоставить элемент «код» в полезной нагрузке, который сообщает Ливи, что выполнять. Здесь я застрял. Могу ли я предоставить код Java здесь?
 – 
Chris
1 Апр 2020 в 22:29
Согласно документации Livy Rest API: «Создает новую интерактивную оболочку Scala, Python или R в кластере». - Вот почему я сомневаюсь, что java-код будет работать в интерактивном сеансе.
 – 
Chris
1 Апр 2020 в 22:29
«Записать вывод в какое-то постоянное место» — это альтернативный подход, о котором я буду думать. Но будет проще, если я смогу заставить Ливи работать. Кроме того, я могу получить ответ через программный API (LivyClient и Job), который предоставляет Livy. Но не могли бы вы сообщить мне, если что-то не так с «кодом», который используется для создания заявления, которое я разместил в своем вопросе.
 – 
Chris
1 Апр 2020 в 22:29
1
Scala — это надмножество Java, поэтому вы должны иметь возможность импортировать библиотеки Java и писать код Java непосредственно в оболочке Scala без каких-либо изменений.
 – 
user4601931
1 Апр 2020 в 22:31