首页 > 解决方案 > Apache Livy - 休息 API

问题描述

我的要求:从 web 应用程序中触发 Yarn 中的 Spark 作业并将结果显示在网页中。spark 作业接受少量参数并计算一个 DataSet,其中包含需要返回给 Web 应用程序的值。

在网上浏览了一些之后,我认为 Livy 可以用于此。

Livy 已经安装了 HDP 2.5。所以我使用 POST/Sessions 创建了新的 Livy 会话,并包含了我的 jar 文件。

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

(我必须包含标题“x-requested-by”,因为启用了 csrfPrevention。)注意:- 必须将 jar 放在 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 和我的主类。但是这样做我不会在我的 Web 应用程序中得到我的结果。

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

}

我尝试在 Livy url 上运行以下代码作为 POST - sessions/20/statements '''

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

调用 GET session/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": [],
}
}

我无法调试此错误。请让我知道我在这里做错了什么。

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

谢谢!

标签: apache-sparklivy

解决方案


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

无论如何,Livy 会话基本上是一个交互式 spark-shell 会话。因此,如果您想使用会话,您将逐行执行程序(RunStatement为每一行向端点提交请求)。然后在最后你会向GetSessionStatement(s)端点询问结果。

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


推荐阅读