java - 如何通过 livy Programmatic API 提交批处理 jar Spark 作业
问题描述
我想使用 livy Programmatic API 提交批处理 jar Spark 作业,就像使用 rest API 批处理一样,我有 json 数据
{
"className": "org.apache.spark.examples.SparkPi",
"queue": "default",
"name": "SparkPi by Livy",
"proxyUser": "hadoop",
"executorMemory": "5g",
"args": [2000],
"file": "hdfs://host:port/resources/spark-examples_2.11-2.1.1.jar"
}
但我找不到任何关于此的文件,这可能吗?如何?
解决方案
是的,您可以使用 Livy 通过 REST API 提交 Spark 作业。请按照以下步骤,
- 首先构建 spark 应用程序并创建程序集 jar 并将应用程序 jar 上传到 hadoop 集群的集群存储(HDFS)上。
- 使用 curl(用于测试)提交作业并使用 http 客户端 api 实现。
在 Scala 中使用 http 客户端提交 Spark 作业的示例代码
import org.apache.http.client.methods.{CloseableHttpResponse, HttpGet,
HttpPost, HttpPut}
import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.{CloseableHttpClient, HttpClientBuilder}
import org.apache.http.util.EntityUtils
import scala.util.parsing.json.{JSON, JSONObject}
def submitJob(className: String, jarPath:String, extraArgs: List[String]) : JSONObject = {
val jobSubmitRequest = new HttpPost(s"${clusterConfig.livyserver}/batches")
val data = Map(
"className"-> className,
"file" -> jarPath,
"driverMemory" -> "2g",
"name" -> "LivyTest",
"proxyUser" -> "hadoop")
if(extraArgs != null && !extraArgs.isEmpty) {
data + ( "args" -> extraArgs)
}
val json = new JSONObject(data)
println(json.toString())
val params = new StringEntity(json.toString(),"UTF-8")
params.setContentType("application/json")
jobSubmitRequest.addHeader("Content-Type", "application/json")
jobSubmitRequest.addHeader("Accept", "*/*")
jobSubmitRequest.setEntity(params)
val client: CloseableHttpClient = HttpClientBuilder.create().build()
val response: CloseableHttpResponse = client.execute(jobSubmitRequest)
HttpReqUtil.parseHttpResponse(response)._2
}
请参阅帖子了解更多详情 https://www.linkedin.com/pulse/submitting-spark-jobs-remote-cluster-via-livy-rest-api-ramasamy/
以下链接中的示例项目 https://github.com/ravikramesh/spark-rest-service
推荐阅读
- github-pages - 从新创建的 github 页面获取 304 响应
- node.js - Keycloak:使用 keycloak-admin 为用户生成访问令牌
- node.js - err_http_headers_sent]:在从服务器获取电子邮件时,无法在将标头发送到客户端后设置标头
- node.js - node.js 中 express 和 process.on('uncaughtException) 处理的错误
- r - 为什么使用 mfrow() 时我的图会被拉伸?
- android - Java Lang NoSuchFieldError 可发布参考管理器
- kivy - 如何摆脱 Kivymd Hot reload Viewer Error
- flutter - 如何在颤动中使用listTile将字符串放在一个圆圈内?
- react-native - react native - 为什么我的 console.log 返回 [] 但项目会在屏幕上呈现?
- python - 成功 url 在我基于类的 DeleteView 中不起作用