从 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 来执行语句,它执行以下操作:
- 通过调用 Livy /sessions REST 创建会话 API
- 然后通过使用 Livy REST API POST //statements 传递上一步中的会话 ID 创建一个语句。在这种情况下,第 2 步给出 500 错误代码。
通过查看 POST /session api 调用的响应(第 1 步),注意到响应正文中有一个 'state' 标志(它是 state='starting'当它以状态 500 失败时)。显然,在继续第 2 步之前需要检查状态标志的状态。有一个 GET /sessions/ Levy REST API 来检查状态状态(直到它从 'starting' 改变)以继续进一步创建语句。
我们使用 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 来执行语句,它执行以下操作:
- 通过调用 Livy /sessions REST 创建会话 API
- 然后通过使用 Livy REST API POST //statements 传递上一步中的会话 ID 创建一个语句。在这种情况下,第 2 步给出 500 错误代码。
通过查看 POST /session api 调用的响应(第 1 步),注意到响应正文中有一个 'state' 标志(它是 state='starting'当它以状态 500 失败时)。显然,在继续第 2 步之前需要检查状态标志的状态。有一个 GET /sessions/ Levy REST API 来检查状态状态(直到它从 'starting' 改变)以继续进一步创建语句。