如何将 Spark 作业提交给 Apache Livy?

How to submit Spark jobs to Apache Livy?

我正在尝试了解如何将 Spark 作业提交给 Apache Livy。

我将以下 API 添加到我的 POM.xml:

 <dependency>
     <groupId>com.cloudera.livy</groupId>
     <artifactId>livy-api</artifactId>
     <version>0.3.0</version>
 </dependency>

 <dependency>
     <groupId>com.cloudera.livy</groupId>
     <artifactId>livy-scala-api_2.11</artifactId>
     <version>0.3.0</version>
 </dependency>

然后我在 Spark 中有以下代码,我想根据要求提交给 Livy。

import org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.spark.sql.functions._

object Test {

  def main(args: Array[String]) {

    val spark = SparkSession.builder()
                            .appName("Test")
                            .master("local[*]")
                            .getOrCreate()


    import spark.sqlContext.implicits._

    implicit val sparkContext = spark.sparkContext

    // ...
  }
}

使用以下代码创建 LivyClient 实例并将应用程序代码上传到 Spark 上下文:

val client = new LivyClientBuilder()
  .setURI(new URI(livyUrl))
  .build()

try {
  client.uploadJar(new File(testJarPath)).get()

  client.submit(new Test())

} finally {
  client.stop(true)
}

但是,问题是 Test 的代码不适用于 Apache Livy。

如何调整 Test 对象的代码才能 运行 client.submit(new Test())?

您的 Test class 需要实现 Livy 的 Job 接口并且您需要在 Test class 中实现它的 call 方法,您可以从那里访问 jobContext/SparkContext。然后,您可以在 submit 方法

中传递 Test 的实例

您不必自己创建 SparkSession,Livy 会在集群上创建它,您可以在 call 方法中访问该上下文。

您可以在此处找到有关 Livy 程序化 API 的更多详细信息:https://livy.incubator.apache.org/docs/latest/programmatic-api.html

下面是测试 Class 的示例实现:

import com.cloudera.livy.{Job, JobContext}

class Test extends Job[Int]{

  override def call(jc: JobContext): Int = {

    val spark = jc.sparkSession()

    // Do anything with SparkSession

    1 //Return value
  }
}