【问题标题】:Apache Livy - Rest APIApache Livy - 休息 API
【发布时间】:2020-04-02 03:37:15
【问题描述】:

我的要求:从 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/ 我可以将代码 sn-ps 传递为“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 - session/20/statements 上将以下代码作为 POST 运行 '''

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

我在调用 GET sessions/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-spark livy


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。
    • 我正在按照您的建议尝试。我首先创建一个会话,然后查询该会话并为该会话 ID 创建语句。创建语句时,我需要在有效载荷告诉 Livy 要执行什么。这就是我卡住的地方。我可以在这里提供 java 代码吗?
    • 根据 Livy Rest API 文档 - “在集群中创建新的交互式 Scala、Python 或 R shell。” - 所以这就是为什么我怀疑 java 代码是否可以在交互式会话中工作
    • “将输出写入某个持久位置” - 这是我将考虑的另一种方法。但如果我能让 Livy 工作会更容易。此外,我可以通过 Livy 提供的编程 api(LivyClient 和 Job)获得响应。但是,如果用于创建我在问题中发布的语句的“代码”有任何问题,请告诉我
    • Scala 是 Java 的超集,因此您应该能够直接在 Scala shell 中导入 Java 库并编写 Java 代码而无需更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多