HiveServer2和metaStore
hiveServer2和metaStore其实都是hive本身带的组件,那么两者究竟有什么不同呢?
- metaStore:hive的metaStore提供的是一个服务,而这个服务就是将hive的元数据暴露出去,而不是需要通过对hive元数据库mysql的访问才能拿到hive的元数据信息;metastore服务实际上就是一种thrift服务,通过它我们可以获取到hive原数据,并且通过thrift获取原数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等等细节
- hiveServer2: HiveServer2(HS2)是一个服务端接口,使远程客户端可以执行对Hive的查询并返回结果。目前基于Thrift RPC的实现是HiveServer的改进版本,并支持多客户端并发和身份验证, 启动hiveServer2服务后,就可以使用jdbc,odbc,或者thrift的方式连接
两者的关系见下图:

HiveThriftServer2
那么hiveThriftServer2又是什么呢?
- 其实HiveThriftServer2是sparkSql中的一个服务,他继承了HiveServer2,也就是说HiveServer2有的功能,它一样也有,Spark Thrift Server的接口和协议都和HiveServer2完全一致,因此我们部署好Spark Thrift Server后,可以直接使用hive的beeline访问Spark Thrift Server执行相关语句。Spark Thrift Server的目的也只是取代HiveServer2,因此它依旧可以和Hive Metastore进行交互,获取到hive的元数据。那么具体有什么不同呢?
详见下表
Hive on Spark | Spark Thrift Server | |
---|---|---|
任务提交模式 | 每个session都会创建一个RemoteDriver,也就是对于一个Application。之后将sql解析成执行的物理计划序列化后发到RemoteDriver执行 | 本身的Server服务就是一个Driver,直接接收sql执行。也就是所有的session都共享一个Application |
性能 | 性能一般 | 如果存储格式是orc或者parquet,性能会比hive高几倍,某些语句甚至会高几十倍。其他格式的话,性能相差不是很大,有时hive性能会更好 |
并发 | 如果任务执行不是异步的,就是在thrift的worker线程中执行,受worker线程数量的限制。异步的话则放到线程池执行,并发度受异步线程池大小限制。 | 处理任务的模式和Hive一样。 |
sql兼容 | 主要支持ANSI SQL 2003,但并不完全遵守,只是大部分支持。并扩展了很多自己的语法 | Spark SQL也有自己的实现标准,因此和hive不会完全兼容。具体哪些语句会不兼容需要测试才能知道 |
HA | 可以通过zk实现HA | 没有内置的HA实现,不过spark社区提了一个issue并带上了patch,可以拿来用:SPARK-11100 |
-
HiveThriftServer2对于spark来说,就是一个任务,也需要spark-submit提交,但是他却是一个常驻的进行,实时监听对应端口的查询任务,并进行查询,具体的执行逻辑参看下图
image.png
网友评论