我想要实现的是让Scala Spark程序(在jar中)从客户端(例如curl)接收POST消息,获取一些参数值,进行一些Spark处理,然后向调用客户端返回结果值。从可用的ApacheLivy文档中,我找不到如何在交互式(即会话模式)中通过Livy从客户端(例如curl)调用编译和打包的Spark程序。通过Livy的这种请求/回复场景可以通过将Scala代码以纯文本形式传递给Spark shell来完成。但是,如何在打包的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
)。但是怎么做呢?
-
使用sbt-assemby插件制作Spark应用程序的uber 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,"state":"available","output":{"status":"ok","execution_count":3大约为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将源代码发送到集群。
Thx,我会试试这个。与此同时,我找到了另一个解决方案:$curl-k--用户"admin:"-v-H"内容类型: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"]}并在Azure Data Lake Gen1帐户中上传包含Scala对象的jar,然后发布声明$curl-k--用户"admin:myPassword"-v-H"内容类型:application/json"-X POST-d@curl-KindSpark_BrandSampleModel_CodeSubmit.json"https://mycluster.azurehdinsight.net/livy/sessions/4/statements"-H"X-请求人:admin"与内容{"code":"import AzureSparkLivy_GL01._;val brandModelSamplesFirstModel=AzureSpark LivyFunction.SampleModelOfBrand(sc,\"Honda");brandModelsamplesFirstMode"}。
因此,我告诉Livy启动一个交互式Spark会话,加载指定的jar,并传递一些代码来调用jar中对象的一个成员。它有效。我也会检查你的建议。