livy在交互式查询中的深度定制

article/2025/10/13 7:53:45

       随着SparkSql在大规模数据分析中的运用越来越广,在大数据分析平台中集成SparkSql提供用户交互式sql查询的功能已经成为了很多开发者的选择,而将SparkSql作为rest服务有两种方式: jobserver和livy;其中livy作为Apache的孵化项目,其良好的框架设计已经成为了spark rest服务的标准接口。

       客户端与livy server交互的基本流程如下图所示:

     

      我们在企业级的大数据平台中选择了livy作为我们的sql查询引擎,同时考虑到平台的需求,对livy的源码进行了深度定制,具体改动包括:

      1. 原生的livy一次只能执行一条sql,后面提交的sql处于waiting状态,而平台的查询需要支持多条sql的并行查询,看下livy中查询的逻辑,在livy-repl模块的Session类中

      

        其中的interpreterExecutor作为sql执行的线程池,其容量大小决定了一次能够并行运行的查询个数,源代码中容量为1,在这里将容量大小修改为可配置,具体的容量大小可以在配置文件中修改。

        2. 原生的livy查询中日志只有session级别的,也即spark-submit的提交日志,然而该日志对用户来说意义不大,当用户执行一条sql查询时,用户关心的是当前查询的执行进度,为此我们对livy的查询日志这块做了修改,新增了查询statement的日志的接口/sessions/{sessionId}/log/statements/{statementId},在livy-reply的模块中,为了能够反映出当前sql的查询进度,我们通过继承了SparkListener接口来将spark执行状态中的关键信息获取到,并且通过Job0/Stage1(10/20)这样的方式打印出来。

                                                                             获取执行进度的类

                                                                                    执行进度                      

由上图可见,用户执行sql查询之后,下方打印出了执行进度,用户通过执行进度中的信息也可以初步看出读取的数据量大小。

         3. 在livy的原生代码中,提交查询之前需要创建一个session,也就是启动一个driver,等driver启动好并且与本地客户端建立好连接,才能提交sql至该session中,session启动中的状态为starting,此时若提交sql,则会返回'session is in starting'错误;因此客户端需要不断轮询session的状态,直到session的状态变为running为止。为了提高用户的交互式体验,我们对这块的逻辑做了变动,当session创建成功之后就可以提交sql,但此时将sql缓存在livy server中,由livy server不断去轮询session的状态并且负责提交。

       在livy server中维护一个提交线程,不断去轮询session的状态并且负责提交sql;同时为了保证在livy server重启中待提交的sql不会丢失,我们注册一个钩子函数,在livy server进程关闭时保存未提交的sql至本地文件,启动后重新读取该文件中的sql内容。

       在session启动时,由于sql并未执行,因此没有执行进度日志,但我们为了提高用户体验,在session启动时封装了虚拟的提交日志,如图所示:

       提交日志中打印出了虚拟的提交进度信息,从而避免用户在没有任何信息的情况下等待。

 

       4. 原生的livy中将查询中的结果缓存在内存之中,当查询的记录比较大时,过多的数据可能会造成内存的压力;对此,我们对查询结果的存储方式进行了改进;首先将结果数据缓存在内存之中,并且设置一个访问活跃程度,当每次有获取查询结果的请求时,活跃度加1;否则活跃度减1,当活跃度为0时,将内存中的数据写入到磁盘中,当有再次的数据访问时,重新将数据从磁盘加载到内存中,也即LRU的基本思路。

 

        5. 平台需要提供数据审计功能,即需要记录用户每条sql对应的查询类型、输入表、输出表等,方便后续进行查询,这里我们通过对sparksql的logicPlan进行解析,从而得到其输入表、输出表等,具体对logicPlan的解析过程可以参考之前写的博客:https://blog.csdn.net/u012477420/article/details/80147793

       进一步,基于logicPlan结合DAG可以获取到当前查询输入的数据量和输出的数据量:

       

 

        6. livy原生代码中,创建交互式session和batch session时,对每个提交的请求是直接创建本地的submit子进程,我们在进行k8s容器化部署时,发现如果同一时间内提交的submit请求过多时,本地的submit进程数量较多,会导致后续的提交出现OOM错误,为了适应容器化部署的特点,对其提交模块做了改进,收到提交请求时首先将请求存储到队列中,后台创建一个线程不断去消费队列中存储的信息,依次完成submit子进程的提交,从而避免一次性创建过多submit子进程导致OOM。

 

       7. 增加对flink的支持。livy的本质上是一个web service服务,为了支持对平台实时计算中flink任务的需求,我们仿照livy batch的代码逻辑编写了flink的提交逻辑:

 

        以上分析的是改动比较大的几个模块,还有一些细节优化不一一列举。基于平台的实际使用需求对livy源码做了定制,从而满足业务的需求。


http://chatgpt.dhexx.cn/article/1OU5xu9X.shtml

相关文章

livy安装文档

1、下载Livy(可以自己下载源代码进行编译) http://livy.incubator.apache.org/download/ 源代码在git 上能够找到apache 版本和cloudera 两个版本 https://github.com/cloudera/livy 有比较详细的说明文档。 2、将livy的压缩包放到Linux 主机上,并解压 3、配…

Hue编译安装适配sparksql(hue+livy+sparksql+pyspark)

一、前言 本篇文章带大家一起编译hue、并使用hue适配livyspark,通过结合Hue、Livy和Spark SQL,可以在一个友好的Web界面中编写和执行SQL查询,并在远程的Spark集群上运行。 1、Hue 介绍 Hue (Hadoop User Experience)是一个开源的Apache Ha…

Apache Livy 安装部署使用示例

Livy 安装部署使用示例 1. Apache Livy 简介2. 安装前置要求3.下载安装包配置相关配置文件4. 启动服务配置使用5.提交任务获取运行结果6.拓展参考 1. Apache Livy 简介 官网:https://livy.apache.org/ Livy是一个提供rest接口和spark集群交互的服务。它可以提交sp…

Livy REST API使用教程

Livy概述 用过Spark的朋友对Livy一定不陌生,Livy是Apache Spark下的一个REST服务,通过Livy,你只要可以发送Http请求,就可以提交Spark任务。Livy在很多Spark数据平台上都作为一个提交任务的重要工具,你可以不知道Livy是…

最全livy代码实战

livy分析应用实战 Github地址:最全livy代码实战 Apache Livy提供Rest service来与Apache Spark进行交互,通过Rest interface或RPC client来简化spark job和spark code snippet的提交,同步或异步获取结果,并提供对spark context的管…

livy部署和使用

部署 使用版本:apache-livy-0.7.1 环境:spark(配置中已添加hive-site.xml) , hive ,hadoop(hdfsyarn) 基于centos livy只需要配置两个文件(livy-env.sh,livy.conf): livy-env.sh 中添加环境变量配置 export JAVA_HOME/usr/local/jdk/jdk1.8…

Spark开源REST服务——Apache Livy(Spark 客户端)

文章目录 一、概述二、Apache Livy模块介绍1)Client2)router3)权限管理4)生成 Spark App5)交互式 Driver6)状态数据存储 三、Apache Livy架构1)Livy架构2)Livy执行作业流程 四、环境…

spark系列-应用篇之通过livy提交Spark任务

#前言 上一篇使用yarn api的提交spark任务比较麻烦, 这次我们使用livy来提交spark任务。livy的使用十分简单,功能上比yarn api还要强大,支持提交spark代码片断,session共享 #安装 下载livy0.5.0,下载完成后进行解压。…

Spark Livy 指南及livy部署访问实践

背景: Apache Spark 是一个比较流行的大数据框架、广泛运用于数据处理、数据分析、机器学习中,它提供了两种方式进行数据处理,一是交互式处理:比如用户使用spark-shell,编写交互式代码编译成spark作业提交到集群上去执…

Livy简单使用 架构解读

Livy使用 —— 关于Session的操作 官网案例:http://livy.incubator.apache.org/examples/ REST API:http://livy.incubator.apache.org/docs/latest/rest-api.html 通过REST API的方式去获取到session,返回活的交互式session 打开Postman&a…

【云原生】Apache Livy on k8s 讲解与实战操作

文章目录 一、概述二、开始编排部署1)部署包准备1)构建镜像2)创建livy chart模板3)修改yaml编排4)开始部署5)测试验证6)卸载 一、概述 Livy是一个提供Rest接口和spark集群交互的服务。它可以提交…

Livy:基于Apache Spark的REST服务

原文:http://geek.csdn.net/news/detail/208943 Apache Spark提供的两种基于命令行的处理交互方式虽然足够灵活,但在企业应用中面临诸如部署、安全等问题。为此本文引入Livy这样一个基于Apache Spark的REST服务,它不仅以REST的方式代替了Spar…

Livy安装使用

本次部署的livy是0.7.0版,zip包下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/incubator/livy/0.7.0-incubating/apache-livy-0.7.0-incubating-bin.zip 安装java jdk1.8 步骤: 一、将下载好的livy的zip包用命令unzip去解压(如果…

livy的安装使用

2019独角兽企业重金招聘Python工程师标准>>> livy简介 Livy是一个提供rest接口和spark集群交互的服务。它可以提交spark job或者spark一段代码,同步或者异步的返回结果;也提供sparkcontext的管理,通过restfull接口或RPC客户端库。Livy也简化了与spark与应用服务的交…

Livy任务提交源码解析

文章目录 简介任务路由代码断任务远程Driver上建立RpcServerLivyServer接收客户端提交代码断任务LivyServer向远程Driver的RpcServer提交任务远程Driver的RpcServer接收任务Driver执行代码断任务Batch任务LivyServer接收batch任务创建BatchSession以提交Spark任务创建SparkYarn…

livy简介

livy简介 什么是livy Livy通过提供REST服务来简化与Spark集群的交互。它可以通过job或者代码片段的方式来提交Spark任务,并同步或者异步地获得任务的结果,以及管理spark context,上述功能通过简单的REST接口或者RPC服务来实现。livy也可以简…

livy部署及应用

一、介绍 Livy把spark交互式和批处理都搬到了web上,提供restful接口,Livy一方面接收并解析客户端提交的REST请求,转换成相应的操作,另一方面它管理着客户端所启动的spark集群 Livy会为用户运行多个session,每个sessio…

C/C++ 实现字符串IP与整数型IP的相互转换

#include <stdio.h> int main() {char ip[32] "192.168.1.151"; //IP值char scIPAddress[32] ""; //存储字符串IPunsigned int nIPAddress 0; //存储整形IPint nTmpIP[4] {0}; //分割IPint i0;//字符串转整形sscanf(ip,"%d.%d.%d.%…

数字字符串转化成 IP 地址

数字字符串转化成 IP 地址 1、参考资料 https://www.nowcoder.com/practice/ce73540d47374dbe85b3125f57727e1e 2、题目要求 题目描述 现在有一个只包含数字的字符串&#xff0c;将该字符串转化成IP地址的形式&#xff0c;返回所有可能的情况。 例如&#xff1a; 给出的字…

IP地址(IPV6)与long数组之间的转换

IP地址&#xff08;IPV6&#xff09;与long数组之间的转换 《IP地址&#xff08;IPV4&#xff09;与int类型之间的转换》《IP地址&#xff08;IPV6&#xff09;与long数组之间的转换》 一、前言 IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#…