如何在Spark上通过ApacheLivy执行一个jar封装的scala程序,该程序直接对客户端请求做出响应



我想要实现的是让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中对象的一个成员。它有效。我也会检查你的建议。

相关内容

最新更新