从 Java 调用 Apache Livy REST API

Calling Apache Livy REST API from Java

我们使用 Apache Livy 从 Spark 集群中的对象存储中读取数据。

Apache Livy API: POST http://server:port/sessions/{sessionId}/statements 请求负载:

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

我看到上述与邮递员一起工作没有问题。我们需要从 Java 调用这个 API。当我们尝试使用 Jersey 客户端(Java 11 上的版本 2.30.1)从 Java 应用程序调用上述 API 时,Apache Livy 服务器 returns 'Internal Server Error' (500)。 Jersey 客户端代码如下所示:


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()));

知道这里出了什么问题吗?感谢您的宝贵时间

它发生在以下场景中:我们有一个 Java API 来执行语句,它执行以下操作:

  1. 通过调用 Livy /sessions REST 创建会话 API
  2. 然后通过使用 Livy REST API POST //statements 传递上一步中的会话 ID 创建一个语句。在这种情况下,第 2 步给出 500 错误代码。

通过查看 POST /session api 调用的响应(第 1 步),注意到响应正文中有一个 'state' 标志(它是 state='starting'当它以状态 500 失败时)。显然,在继续第 2 步之前需要检查状态标志的状态。有一个 GET /sessions/ Levy REST API 来检查状态状态(直到它从 'starting' 改变)以继续进一步创建语句。