如何通过Spark上的Apache Livy执行jar打包的scala程序,以直接响应客户端请求的结果?

时间:2019-01-05 21:43:01

标签: scala apache-spark curl livy

我打算实现的是让Scala Spark程序(在jar中)从客户端接收POST消息,例如卷曲,获取一些参数值,进行一些Spark处理,然后将结果值返回给调用客户端。 从可用的Apache Livy文档中,我找不到一种方法可以通过交互式(即会话)模式通过Livy从客户端(例如curl)调用已编译和打包的Spark程序。通过Livy进行的这种请求/答复场景可以通过以纯文本形式传递到Spark外壳的Scala代码来完成。但是如何在包装好的jar中使用Scala类呢?

curl -k --user "admin:mypassword" -v \
-H "Content-Type: application/json" -X POST \
-d @Curl-KindSpark_ScalaCode01.json \
"https://myHDI-Spark-Clustername.azurehdinsight.net/livy/sessions/0/statements" \
-H "X-Requested-By: admin"

我宁愿传递jar文件的路径和文件名以及ClassName和Argument值,而不是将Scala源代码作为数据(-d @Curl-KindSpark_ScalaCode01.json)。但是如何?

2 个答案:

答案 0 :(得分:0)

  • 使用sbt-assemby插件为您的Spark应用制作一个超级jar。

  • 将上一步中的jar文件上传到HDFS集群: hdfs dfs -put /home/hduser/PiNumber.jar /user/hduser

  • 通过livy执行工作: curl -X POST -d '{"conf": {"kind": "spark" , "jars": "hdfs://localhost:8020/user/hduser/PiNumber.jar"}}' -H "Content-Type: application/json" -H "X-Requested-By: user" localhost:8998/sessions

  • 检查: curl localhost/sessions/0/statements/3

  

{“ id”:3,“状态”:“可用”,“输出”:{“状态”:“确定”,“执行次数”:3,“数据”:{“文本/纯文本”:“ Pi   大约是3.14256“}}}

p.s。

用于Scala / Java的Spark Livy API需要使用uber jar文件。 sbt-assembly不能立即制成胖子,这让我很烦。 通常,我使用Livy的Python API进行烟雾测试和调整。

使用Python进行健全性检查:

  • curl localhost:sessions/0/statements -X POST -H 'Content-Type: application/json' -d '{"code":"print(\"Sanity check for Livy\")"}'

您可以在字段code中添加更复杂的逻辑。 顺便说一句,这是流行的Spark笔记本工作方式-通过Livy将源代码发送到集群。

答案 1 :(得分:0)

谢谢,我会尝试的。同时,我找到了另一个解决方案: $ curl -k --user“ admin:” -v -H“ Content-Type:application / json” -X POST -d @ Curl-KindSpark_BrandSampleModel_SessionSetup.json“ https://mycluster.azurehdinsight.net/livy/sessions 与包含的JSON文件 {     “ kind”:“ spark”,     “ jars”:[“ adl://skylytics1.azuredatalakestore.net/skylytics11/azuresparklivy_2.11-0.1.jar”] } 并在包含Scala对象的Azure Data Lake Gen1帐户中使用上载的jar,然后发布该语句 $ curl -k --user“ admin:myPassword” -v -H“ Content-Type:application / json” -X POST -d @ Curl-KindSpark_BrandSampleModel_CodeSubmit.json“ https://mycluster.azurehdinsight.net/livy/sessions/4/statements” -H“ X-Requested-由:管理员“ 与内容 {     “ code”:“导入AzureSparkLivy_GL01._; val brandModelSamplesFirstModel = AzureSparkLivyFunction.SampleModelOfBrand(sc,\” Honda \“); brandModelSamplesFirstModel” }。

因此,我告诉Livy启动交互式Spark会话并加载指定的jar,并传递了一些代码来调用jar中对象的成员。有用。也会检查您的建议。