Apache Livy - Rest API



我的需求:从web应用程序触发Yarn中的Spark作业,并将结果显示回网页。spark作业只接受少量参数,并使用需要返回到web应用程序的值来计算数据集。

在网上浏览了一些之后,我觉得Livy可以用来做这件事。

Livy已经安装了HDP2.5。因此,我使用POST/Sessions创建了新的Livy会话,并包含了我的jar文件。

{"kind":"spark","name":"livy","jars":["/xyz.jar"],"proxyUser":"livy"}

(由于启用了csrfPrevention,我不得不包含标头"x-requested-by"。(注意:-罐子必须放在HDFS中才能工作

根据Livy示例:https://livy.apache.org/examples/我可以将代码片段作为"data={'code':'1+1'}"传递我不明白如何调用类中的方法。根据Livy Rest API文档,我没有"className"选项-https://livy.apache.org/docs/latest/rest-api.html

如果我使用POST/Batch创建会话,我可以指定一个jar和我的主类。但这样做我不会在我的网络应用程序中得到我的结果。

我的jar文件中的Java代码:

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

我尝试在Livyurl-sessions/20/statements上以POST的形式运行以下代码''

{
"code": "import LivySample;LivySample lv = new LivySample();lv.executeSampleLivy(sc, "abc")"
}

调用GET会话/21/语句/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": [],
}
}

我无法调试此错误。你能告诉我我在这里做错了什么吗。

我可以在LivyRest API中使用Java吗?就像我在这里指定的那样。

谢谢!

我更熟悉批处理API,但我认为在会话API中,应该在请求的files字段中提供应用程序JAR,而不是jars(矛盾的是(。

无论如何,Livy会话基本上是一个交互式的火花壳会话。因此,如果您想使用会话,您可以逐行地浏览程序(每行都向RunStatement端点提交一个请求(。然后在最后,您会向GetSessionStatement(s)端点询问结果。

或者(也许更容易(,您可以使用批处理API,只需将输出写入某个持久位置,并在批处理达到"成功"状态时让web应用程序将其公开。

最新更新