Scala 使用curl在livy上提交spark作业

Scala 使用curl在livy上提交spark作业,scala,apache-spark,livy,Scala,Apache Spark,Livy,我正在通过Curl提交livy 0.6.0会话上的spark作业 作业是一个大jar文件,它扩展了作业接口,如下所示: 实际上,使用此curl命令运行此代码时: curl -X POST -d '{"kind": "spark","files":["/config.json"],"jars":["/myjar.jar"],"driverMemory":"512M","executorMemory":"512M"}' -H "Content-Type: application/json" loc

我正在通过Curl提交livy 0.6.0会话上的spark作业

作业是一个大jar文件,它扩展了作业接口,如下所示:

实际上,使用此curl命令运行此代码时:

curl -X POST -d '{"kind": "spark","files":["/config.json"],"jars":["/myjar.jar"],"driverMemory":"512M","executorMemory":"512M"}' -H "Content-Type: application/json" localhost:8998/sessions/
当涉及到代码时,它与上面显示的答案完全相同:

package com.mycompany.test
import org.apache.livy.{Job, JobContext}
import org.apache.spark._
import org.apache.livy.scalaapi._

object Test extends Job[Boolean]{
  override def call(jc: JobContext): Boolean = {
  val sc = jc.sc
  sc.getConf.getAll.foreach(println)
  return true
}
至于错误,它是一个java空指针异常,如下所示

Exception in thread "main" java.lang.NullPointerException
    at org.apache.livy.rsc.driver.JobWrapper.cancel(JobWrapper.java:90)
    at org.apache.livy.rsc.driver.RSCDriver.shutdown(RSCDriver.java:127)
    at org.apache.livy.rsc.driver.RSCDriver.run(RSCDriver.java:356)
    at org.apache.livy.rsc.driver.RSCDriverBootstrapper.main(RSCDriverBootstrapper.java:93)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
    at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:849)
    at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:167)
    at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:195)
    at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
    at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:924)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:933)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

由于输出是开始在jar中运行作业,因此我使用了livy REST API,关于这一点,有两种方法可以提交spark作业。请参考rest api,您将公平理解livy rest请求: 1.批次: 提交请求后,您将获得作业id。根据作业id,您将轮询spark作业的状态。在这里,您可以选择执行uber jar以及代码文件,但我从未使用过后者

二,。Session/sessions和/sessions/{sessionId}/语句: 您将spark作业作为代码提交,无需创建uber jar。在这里,首先创建一个会话,在此会话中执行语句的实际代码

对于这两种方法,如果您查看文档,它会很好地解释相应的rest请求和请求主体/参数

示例/样本包括:

对代码的更正如下:

批处理

会议和发言


像上面的例子那样发送一个作业怎么样?我不能每次都通过curl发送代码,这就是为什么我有一个jar,问题是如何让这个jarwork@AhmedAdnaneA米利:我认为从我提到的方法来看,这是非常清楚的。如果你想使用uber jar方法,请参考批处理方法,并提供了相同的curl示例。你的评论提供了大量信息,但它没有回答所问的问题。即使使用批处理命令,问题仍然存在,我认为问题在于jar文件,你知道我应该如何编译我的jar/编写我的代码吗?我可以使用jar文件的s3路径吗?@Yegeny是的,你可以使用s3路径。
curl \
  -X POST \
  -d '{
    "kind": "spark",
    "files": [
      "<use-absolute-path>"
    ],
    "file": "absolute-path-to-your-application-jar",
    "className": "fully-qualified-spark-class-name",
    "driverMemory": "512M",
    "executorMemory": "512M",
    "conf": {<any-other-configs-as-key-val>}
  }' \
  -H "Content-Type: application/json" \
  localhost:8998/batches/
// Create a session
curl \
  -X POST \
  -d '{
    "kind": "spark",
    "files": [
      "<use-absolute-path>"
    ],
    "driverMemory": "512M",
    "executorMemory": "512M",
    "conf": {<any-other-configs-as-key-val>}
  }' \
  -H "Content-Type: application/json" \
  localhost:8998/sessions/

// Run code/statement in session created above
curl \
  -X POST \
  -d '{
    "kind": "spark",
    "code": "spark-code"
  }' \
  -H "Content-Type: application/json" \
  localhost:8998/sessions/{sessionId}/statements