Вызов API REST Apache Livy из Java

Мы используем Apache Livy для чтения данных из объектного хранилища в кластере Spark.

Apache Livy API: POST http: // server: port / sessions / {sessionId} / statement Полезная нагрузка запроса:

{"code":" val df = spark.read.option(\"header\", true).json(\"xxx://somebucket@somenamespace/xyz\"); \n    df.toJSON.collect.mkString(\"[\", \",\", \"]\")"}

Я вижу, как это работает с почтальоном без проблем. Нам нужно вызвать этот API из Java. Когда мы попытались вызвать указанный выше API из приложения Java с помощью клиента Jersey (версия 2.30.1 на Java 11), сервер Apache Livy вернул «Internal Server Error» (500). Код клиента Джерси выглядит так, как показано ниже:


JSONObject payLoad = new JSONObject();
String codeBlock = "val df = spark.read.option(\"header\", true).json(\"xxx://somebucket@somenamespace/xyz\"); \n    df.toJSON.collect.mkString(\"[\", \",\", \"]\")";
payLoad.put("code", codeBlock);

// In this e.g, session id: '0' is created before calling the below API
String apacheLivyUrl = "http://localhost:8998/sessions/0/statements";
Response response = ClientBuilder.newBuilder().build().target(apacheLivyUrl)
        .request(MediaType.APPLICATION_JSON)
        .accept(MediaType.APPLICATION_JSON)
        .post(Entity.json(payLoad.toString()));

Есть идеи, что здесь не так? Спасибо за ваше время


person Jobinesh    schedule 24.06.2020    source источник
comment
вы уверены, что используете один и тот же URL в обоих случаях? (включая тот же идентификатор сеанса)   -  person mangusta    schedule 24.06.2020
comment
кстати вы пробовали пользоваться без .accept(MediaType.APPLICATION_JSON)?   -  person mangusta    schedule 24.06.2020
comment
Да на оба вопроса   -  person Jobinesh    schedule 24.06.2020


Ответы (1)


Это происходит по следующему сценарию: у нас есть Java API для выполнения оператора, и он выполняет следующие действия:

  1. Создайте сеанс, вызвав Livy / sessions REST API
  2. Затем создайте оператор, передав идентификатор сеанса из предыдущего шага с помощью операторов Livy REST API POST //. В этом случае шаг 2 дает код ошибки 500.

Посмотрев на ответ на вызов API POST / сеанса (шаг 1), заметил флаг «состояние» в теле ответа (он был state = «start», когда произошел сбой со статусом 500). По-видимому, необходимо проверить состояние флага состояния, прежде чем переходить к шагу 2. Существует GET / sessions / Levy REST API для проверки состояния состояния (до тех пор, пока он не изменится с «start»), чтобы продолжить создание оператора.

person Jobinesh    schedule 25.06.2020