我正在尝试了解如何向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())
?
答案 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
}
}