文章目录
- 简介
- 任务路由
- 代码断任务
- 远程Driver上建立RpcServer
- LivyServer接收客户端提交代码断任务
- LivyServer向远程Driver的RpcServer提交任务
- 远程Driver的RpcServer接收任务
- Driver执行代码断任务
- Batch任务
- LivyServer接收batch任务
- 创建BatchSession以提交Spark任务
- 创建SparkYarnApp实例以操作远程Spark任务
简介
Livy是基于Spark的开源REST服务,它能够通过REST的方式将代码段或是序列化的二进制代码提交到Spark集群中去执行。用户以REST请求的方式通过Livy启动一个新的Spark集群,Livy将每一个启动的Spark集群称之为一个会话(session),一个会话是由一个完整的Spark集群所构成的,并且通过RPC协议在Spark集群和Livy服务端之间进行通信。根据处理交互方式的不同,Livy将会话分成了两种类型:一,交互式会话(interactive session)。这与Spark中的交互式处理相同,交互式会话在其启动后可以接收用户所提交的代码片段,在远端的Spark集群上编译并执行。二批处理会话(batch session)。用户可以通过Livy以批处理的方式启动Spark应用,这样的一个方式在Livy中称之为批处理会话,这与Spark中的批处理是相同的。
与原生Spark不同的是,所有操作都是通过REST的方式提交到Livy服务端上,再由Livy服务端发送到不同的Spark集群上去执行。Livy的架构如下:
各功能模块图如下,其任务提交流程:
任务路由
livy server提供的api是rest api,Client发送的请求也是针对各个资源(uri)的增删改查。router的核心职责是管理好要把对什么资源的什么操作指派给哪个类的哪个函数来处理,该模块核心类是 SessionServlet,有两个子类:InteractiveSessionServlet接收处理/sessions/*
下的所有请求,BatchSessionServlet接收处理/batches/*
下的所有请求,分别用来路由对session及batch相关的请求。
// LivyServer.scala
override def contextInitialized(sce: ServletContextEvent): Unit =