我的要求:从web应用程序触发Yarn中的Spark作业,并在网页中显示结果。spark作业接受的参数很少,并使用需要返回给web应用程序的值计算DataSet。
在网上浏览之后,我认为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和我的主class.But这样做,我将不会在我的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": [],
}
}我无法调试这个error.Can,请让我知道我在这里做错了什么。
我可以像我在这里指定的那样在LivyRest应用程序接口中使用Java吗?
谢谢!
发布于 2020-04-02 02:53:45
我更熟悉batches API,但我相信在session API中,您的应用程序JAR应该在请求的files字段中提供,而不是jars (矛盾的)。
无论如何,Livy会话基本上是一个交互式的spark-shell会话。因此,如果希望使用会话,则需要逐行执行程序(为每一行向RunStatement端点提交一个请求)。最后,您将向GetSessionStatement(s)端点询问结果。
或者(也许更容易),您可以使用批处理API,只需将输出写入某个持久位置,并在批处理达到“成功”状态时让您的web应用程序公开它。
https://stackoverflow.com/questions/60923218
复制相似问题