Apache Kyuubi、Spark Thrift Server与Hive Server2

news2024/11/26 14:42:13

HiveServer2和Spark Thrift Server

HiveServer2和Spark Thrift Server,两者其实都是提供一个常驻的SQL服务,用来对外提供高性能的SQL引擎能力,不过两者又有些偏差,主要是HS2是独立的Server,可组成集群,而STS是运行在Yarn上的常驻服务,因此会受到很多局限。

STS和HS2真可谓是一个复杂的历史,最开始的时候,Spark SQL的代码几乎全部都是Hive的照搬,随着时间的推移,Hive的代码被逐渐替换,直到几乎没有原始的Hive代码保留,具体的内容可以参考:

参考:https://en.wikipedia.org/wiki/Ship_of_Theseus

Spark最开始打包的是Shark和SharkServer(Spark和Hive的结合体)。那个时候,这个结合体包含了大量的Hive代码。SharkServer就是Hive,它解析HiveQL,在Hive中进行优化,读取Hadoop的输入格式,到最后Shark甚至在Spark引擎上运行Hadoop风格的MapReduce任务。这一点在当时来说其实很酷的,因为它提供了一种无需进行任何编程就能使用Spark的方式,HQL做到了。不幸的是,MapReduce和Hive并不能完全融入Spark生态系统,2014年7月,社区宣布Shark的开发在Spark1.0的时终止,因为Spark开始转向更多Spark原生的SQL表达式。同时社区将重心转向原生的Spark SQL的开发,并且对已有的Hive用户提供过渡方案Hive on Spark来进行将Hive作业迁移到Spark引擎执行,可以参考:

https://github.com/amplab/shark/wiki/Shark-User-Guidehttps://databricks.com/blog/2014/07/01/shark-spark-sql-hive-on-spark-and-the-future-of-sql-on-spark.html

Spark引入SchemaRDDs,Dataframes和DataSets来表示分布式数据集。有了这些,一个名为Catalyst的全新Spark原生优化引擎引入到Spark,它是一个Tree Manipulation Framework,为从GraphFrames到Structured Streaming的所有查询优化提供依据。Catalyst的出现意味着开始丢弃MapReduce风格的作业执行,而是可以构建和运行Spark优化的执行计划。此外,Spark发布了一个新的API,它允许我们构建名为“DataSources”的Spark-Aware接口。DataSources的灵活性结束了Spark对Hadoop输入格式的依赖(尽管它们仍受支持)。DataSource可以直接访问Spark生成的查询计划,并执行谓词下推和其他优化。

Hive Parser开始被Spark Parser替代,Spark SQL仍然支持HQL,但语法已经大大扩展。Spark SQL现在可以运行所有TPC-DS查询,以及一系列Spark特定的扩展。(在开发过程中有一段时间你必须在HiveContext和SqlContext之间进行选择,两者都有不同的解析器,但我们不再讨论它了。今天所有请求都以SparkSession开头)。现在Spark几乎没有剩下Hive代码。虽然Sql Thrift Server仍然构建在HiveServer2代码上,但几乎所有的内部实现都是完全Spark原生的。

不过Spark Thrift Server的接口和协议都和HiveServer2完全一致,因此我们部署好Spark Thrift Server后,可以直接使用hive的beeline访问Spark Thrift Server执行相关语句,Spark Thrift Server的目的也只是取代HiveServer2,并不是取代整个Hive的SQL引擎体系,因此它依旧可以和Hive Metastore进行交互,获取到hive的元数据。

还有就是Thrift Server也是Spark提供的一种JDBC/ODBC访问Spark SQL的服务,它是基于Hive1.2.1的HiveServer2实现的,只是底层的SQL执行改为了Spark,同时是使用spark submit启动的服务。同时通过Spark Thrift JDBC/ODBC接口也可以较为方便的直接访问同一个Hadoop集群中的Hive表,通过配置Thrift服务指向连接到Hive的metastore服务即可。

并且Spark Thrift Server大量复用了HiveServer2的代码,HiveServer2的架构主要是通过ThriftCLIService监听端口,然后获取请求后委托给CLIService处理。CLIService又一层层的委托,最终交给OperationManager处理。OperationManager会根据请求的类型创建一个Operation的具体实现处理。比如Hive中执行sql的Operation实现是SQLOperation。

Spark Thrift Server做的事情就是实现自己的CLIService——SparkSQLCLIService,接着也实现了SparkSQLSessionManager以及SparkSQLOperationManager。另外还实现了一个处理sql的Operation——SparkExecuteStatementOperation。这样,当Spark Thrift Server启动后,对于sql的执行就会最终交给SparkExecuteStatementOperation了。

Spark Thrift Server其实就重写了处理sql的逻辑,其他的请求处理就完全复用HiveServer2的代码了。比如建表、删除表、建view等操作,全部使用的是Hive的代码。

对于STS中的SQL执行,Spark Thrift Server的启动其实是通过spark-submit将HiveThriftServer2提交给集群执行的。因此执行start-thriftserver.sh时可以传入spark-submit的参数表示提交HiveThriftServer2时的参数。另外,因为HiveThriftServer2必须要在本地运行,所以提交时的deployMode必须是client,如果设置成cluster会报错。HiveThriftServer2运行起来后,就等于是一个Driver了,这个Driver会监听某个端口,等待请求,也就是这样:

所以HiveThriftServer2程序运行起来后就等于是一个长期在集群上运行的spark application,通过yarn或者spark history server页面我们都可以看到对应的任务。

既然HiveThriftServer2就是Driver,那么运行SQL就很简单了。Spark Thrift Server收到请求后最终是交给SparkExecuteStatementOperation处理,SparkExecuteStatementOperation拿到SQLContext,然后调用SQLContext.sql()方法直接执行用户传过来的sql即可。后面的过程就和我们直接写了一个Main函数然后通过spark-submit提交到集群运行是一样的,一张图总结一下STS和HS2的区别:

 

Hive Server2 在大部分的Hadoop发行版中自然就会启动,而STS这不会,因为考虑到其不稳定性,都需要自行维护,不过使用方式也很简单:

命令为:
./sbin/start-thriftserver.sh

参数信息:
export HIVE_SERVER2_THRIFT_PORT=<listening-port>
export HIVE_SERVER2_THRIFT_BIND_HOST=<listening-host>
./sbin/start-thriftserver.sh \
  --master <master-uri> \
  ...

或者
./sbin/start-thriftserver.sh \
  --hiveconf hive.server2.thrift.port=<listening-port> \
  --hiveconf hive.server2.thrift.bind.host=<listening-host> \
  --master <master-uri>
  ...

然后则可以使用beeline进行访问:

./bin/beeline

beeline> !connect jdbc:hive2://localhost:10000

beeline> !connect jdbc:hive2://<host>:<port>/<database>?hive.server2.transport.mode=http;hive.server2.thrift.http.path=<http_endpoint>

./bin/spark-sql

Spark Thrift Server的优点

  • 在大部分场景下,性能要比Hive on spark好,而且好很多
  • SparkSQL的社区活跃度也很高,基本每月都会发布一个版本,因此性能还会不断提高

Spark Thrift Server的缺点

  • 因为HiveThriftServer2是以Driver的形式运行在集群的。因此它能使用的集群资源就和单个Application直接挂钩。如果spark集群没开启动态资源,那么Spark Thrift Server能得到的资源就始终都是固定的,这时候设置太大也不好,设置太小也不好。即使开启了动态资源,一般集群都会设置maxExecutor,这时还是无法很好的利用集群的所有资源。如果将集群所有的资源都分配给了这个Application,这样像yarn、mesos这些资源调度器就完全没有存在的意义了…因此,单就这一点,Spark Thrift Server就不是一个合格的企业级解决方案。
  • 从[SPARK-11100] HiveThriftServer HA issue,HiveThriftServer not registering with Zookeeper - ASF JIRA 官方的回答来看,spark官方对于Spark Thrift Server这套解决方案也不是很满意。这也可以理解,毕竟Spark Thrift Server只是对HiveServer2进行的一些小改造。
  • Spark Thrift Server目前还是基于Hive的1.2版本做的改造,因此如果MetaStore的版本不是1.2,那么也可能会有一些兼容性的潜在问题。
  • 不支持用户模拟,即Thrift Server并不能以提交查询的用户取代启动Thrift Server的用户来执行查询语句,具体对应到Hive的hive.server2.enable.doAs参数不支持,参考:[SPARK-5159] Thrift server does not respect hive.server2.enable.doAs=true - ASF JIRA
  • 因为上述第一点不支持用户模拟,导致任何查询都是同一个用户,所有没办法控制Spark SQL的权限,所以当你需要Spark SQL也要做权限控制的时候,只有自己去实现ranger的plugin了。
  • 单点问题,所有Spark SQL查询都走唯一一个Spark Thrift节点上的同一个Spark Driver,任何故障都会导致这个唯一的Spark Thrift节点上的所有作业失败,从而需要重启Spark Thrift Server。
  • 并发差,上述第三点原因,因为所有的查询都要通过一个Spark Driver,导致这个Driver是瓶颈,于是限制了Spark SQL作业的并发度。

不过所以网易自己做了一个Thrift服务取名Kyuubi,有兴趣的可以去看看:https://github.com/apache/incubator-kyuubi

Kyuubi和Livy以及Spark ThriftServer对比

对比项KyuubiLivySpark ThriftServer
支持接口SQL、ScalaSQL、Scala、Python and RSQL
支持引擎Spark、Flink、TrinoSparkSpark
Spark版本Spark 3.xSpark 2.x & Spark 3.xSpark组件自带
协议支持Thrift + JDBCHTTP,Thrift + JDBCThrift + JDBC
客户端Kyuubi BeelineHTTP ClientSpark Beeline
高可用支持支持不支持
资源隔离支持支持不支持
LDAP认证支持支持支持

参考:

 Spark Thrift Server与Hive Server2 的区别详解 | 白发川的BLOG (baifachuan.com)

https://kyuubi.apache.org/docs/r1.5.1-incubating/overview/kyuubi_vs_thriftserver.html?spm=a2c4g.11186623.0.0.16403b99zk1LSp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【进阶】C语言第三课:升级你的指针(2)

目录 &#x1f347;前言&#x1f347;&#xff1a; 一、数组参数&#x1f920;&#xff1a; 1.一维数组传参&#x1f348;&#xff1a; 2.二维数组传参&#x1f349;&#xff1a; 二、指针参数&#x1f929;&#xff1a; 1.一级指针传参&#x1f34a;&#xff1a; 2.二级指针…

【论文写作】课程总结

文章目录1、前言2、概述3、摘要与关键字4、引言5、相关工作6、理论7、实验8、总结1、前言 《论文写作》不仅是本人认为的在本学期收获较大的一门&#xff0c;也是最重要的课程之一。因为作为研究生&#xff0c;论文是必不可少的一部分。论文是就自己研究方向中所得到的成果的一…

网络设备的运行隐患怎么排除?日常的例行维护绝对不能少,收藏本文,轻松拿捏各种场景!

设备稳定运行一方面依赖于完备的网络规划&#xff0c;另一方面&#xff0c;也需要通过日常的维护发现并消除设备的运行隐患。 日常维护怎么才能进行呢&#xff1f;有哪些必要的步骤呢&#xff1f; 记住这五步&#xff1a; 1、设备环境检查 设备运行环境正常是保证设备正常运…

PreScan快速入门到精通第四十二讲点云传感器

点云传感器(PCS)是一种理想化的传感器,用于构建高数据率和高更新率的点云数据。该传感器的实际应用包括检测算法的开发、激光雷达系统的设计和验证或HIL验证。同时具备竖直方向的FOV相关信息,支持4D成像雷达系统的仿真开发。 该传感器具有固定但可配置的模式,并针对性能(…

分享一些冷门但却很实用的css样式

在平常的代码工作中&#xff0c;有很多冷门不常用的css样式标签。有些偏门、冷门的标签一般都记不住&#xff0c;想起来的时候就又会去现找&#xff0c;很影响工作效率&#xff0c;现在&#xff0c;把这些标签都统一整理一下用的少但是超级实用的css样式。 ::-Webkit-Input-Pla…

0基础转行学软件测试,哪些技术是必须要掌握的?

作为近些年非常热门的IT岗位&#xff0c;软件测试-受到越来越多应届毕业生和诸多转行群体的青睐。为了满足同学们对软件测试的学习要求&#xff0c;测试猿课堂将在本文为大家详细讲述成为自动化软件测试工程师必须要具备的能力体系。 软件测试的学习体系总的来讲可以分为五个阶…

Redis框架(十一):大众点评项目 乐观锁解决超卖问题 悲观锁解决一人一单问题

大众点评项目 基于Session的短信登录需求&#xff1a;乐观锁解决超卖问题 悲观锁解决一人一单问题业务代码总结SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将会回顾Redis实战项目 大众点评 主要依照以下几个原则 基础实战的Demo和Codi…

数字IC后端设计如何快速入门?(内附学习视频)

虽然2022年IC行业门槛有所提高&#xff0c;但这也抵挡不住同学们对转行IC行业的热情&#xff0c;数字后端设计的发展前景和高薪也在众多岗位中脱颖而出&#xff0c;那么数字IC后端设计如何快速入门&#xff1f;下面IC修真院就带大家来了解一下。 数字后端工程师是做什么的&…

Docker:自定义镜像上传阿里云

目录 一.jdkv.1.0的制作 启动虚拟机&#xff0c;进入centos 创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件 执行Dockerfile文件&#xff0c;初次依赖镜像的时候会下载相应镜像​​​​​​​ 二.jdk2.0的制作 三.jdk3.0的制作 四.将制作好的镜像上传阿里云…

一文解读机密容器的崛起和发展

在 2022 云栖大会龙蜥峰会云原生专场上&#xff0c;来自阿里云操作系统技术专家冯世舫和Intel 系统软件工程部高级研发经理朱江云分享了《机密容器的崛起和发展》技术演讲&#xff0c;以下为本次演讲内容&#xff1a; 机密容器是 CNCF 的 一个 Sandbox 项目&#xff0c;用于解…

第一章 linux的发展

第一章 linux的发展一、操作系统的出现二、linux的出现三、linux的发展一、操作系统的出现 大部分先进产品的出现必定是为了军事服务的&#xff0c;起初的大型计算机也同样是为了军事服务的&#xff0c;而操作计算机的人也不是程序员&#xff0c;而是科学家。二战时期&#xf…

DVWA靶场中SQL注入

DVWA靶场中SQL注入1.DVWA靶场中SQL注入1.1.SQL Injection1.1.1.Low级别1.1.2.Medium级别1.1.3.High级别1.2.SQL Injection(Blind)1.2.1.方式1.2.2.Low级别1.2.3.Medium级别1.2.4.High级别1.DVWA靶场中SQL注入 1.1.SQL Injection 1.1.1.Low级别 1&#xff09;判断注入类型当输…

高中数理化杂志高中数理化杂志社高中数理化编辑部2022年第21期目录

高考全关注《高中数理化》投稿&#xff1a;cn7kantougao163.com 直线与圆的方程高考热点赏析 廖永福; 1-4 一道课本例题到一道高考试题的衍变之路 高磊; 4-8 圆的多种定义形式在解题中的应用 李光彬;邵建凤; 9-10 从2021年全国新高考Ⅰ卷第21题说起 王菊;张琥;…

碳交易机制下考虑需求响应的综合能源系统优化运行(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

接口测试(五)—— PyMySQL增删改查、数据库工具类封装

目录 数据库操作应用场景 一、PyMySQL操作数据库 1、安装PyMySQL 2、PyMySQL操作步骤 3、事务的概念 4、PyMySQL连接数据库 4.1 建立连接方法 4.2 入门案例 5、PyMySQL操作数据库 5.1 SQL 语法 5.2 数据库查询 5.3 案例&#xff08;查询&#xff09; 5.4 数据库UI…

代码随想录训练营第七天

专题&#xff1a;哈希表 题目&#xff1a;四数相加 题目简单&#xff1a;把四个数组分成两队&#xff0c;然后用map&#xff0c;保存前两个数组的元素之和&#xff0c;&#xff08;key,val&#xff09;key保存的是前两个数组的元素之和的数值&#xff0c;val保存的是数值对应…

PDF设置密码保护的两种方法

PDF文件可以根据需要&#xff0c;设置两种密码来保护文件。 需要保护文件内容&#xff0c;不想PDF被随意打开&#xff0c;我们可以设置打开密码&#xff0c;这样只有输入正确的密码才能打开文件。 在编辑器中打开PDF后&#xff0c;找到菜单中【保护】选项下的【密码加密】&am…

SpringCloud01

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff1a;将业务的所有功能集…

33-98-spark-核心编程-RDD算子和任务阶段等

33-spark-核心编程-RDD&#xff1a; 1、RDD的创建&#xff0c;4中方式。分别是从内存中创建&#xff0c;从文件中创建&#xff0c;从其他RDD创建和new RDD&#xff0c;后两者不常用。 创建&#xff1a;big-data-study\Spark-demo\src\main\java\spark\core\com\zh\rdd\builde…

PTA-基础编程题目集(函数题)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【[PTA刷题训练营]】 目录6-1 简单输出整数6-2 多项式求值&#xff08;重点掌握&#xff09;6-3 简单求和6-4 求自定类型元素的平均6-5 求…