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

时间:2018-03-11 13:22:38

标签: scala apache-spark livy

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

我在POM.xml中添加了以下API:

 <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())

1 个答案:

答案 0 :(得分:2)

您的Test类需要实现Livy的Job接口,您需要在call类中实现其Test方法,您可以从中访问jobContext / SparkContext。然后,您可以在Test方法

中传递submit的实例

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

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

以下是测试类的示例实现:

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
  }
}