Livy任务提交源码解析

简介

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架构图

各功能模块图如下,其任务提交流程:

livy模块图

任务路由

livy server提供的api是rest api,Client发送的请求也是针对各个资源(uri)的增删改查。router的核心职责是管理好要把对什么资源的什么操作指派给哪个类的哪个函数来处理,该模块核心类是 SessionServlet,有两个子类:InteractiveSessionServlet接收处理/sessions/*下的所有请求,BatchSessionServlet接收处理/batches/*下的所有请求,分别用来路由对session及batch相关的请求。

// LivyServer.scala
override def contextInitialized(sce: ServletContextEvent): Unit = {
  val context = sce.getServletContext()

  val interactiveServlet = new InteractiveSessionServlet(
    interactiveSessionManager, sessionStore, livyConf, accessManager)
  mount(context, interactiveServlet, "/sessions/*")

  val batchServlet =
    new BatchSessionServlet(batchSessionManager, sessionStore, livyConf, accessManager)
  mount(context, batchServlet, "/batches/*")
}

下面结合源码介绍下提交代码断的交互式任务和Batch任务的处理流程。

代码断任务

远程Driver上建立RpcServer

InteractiveSession通过向远程Driver上的RpcServer提交任务,从而执行交互式任务。RpcServer是运行在Driver上的一个服务,用于接收客户端提交的job任务。ReplDriver是RSCDriver的子类,是InteractiveSession对应的Spark App driver,用来接收livy server的各种请求并进行处理。driver内部的启动流程主要是在RSCDriver#run中。

// RSCDriver.java
void run() throws Exception {
  this.running = true;

  try {
	// 创建并初始化RpcServer,等待RSCClient进行连接以接收任务
	// 用于连接 client 并告知 server 端 rpc 地址,client 获知 server rpc 地址后会进
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值