目录
介绍
HS2 架构
Server--服务器层
Transport--传输层
Protocol--协议层
Processor
HS2的依赖关系
JDBC 客户端
源代码描述
服务器端
客户端
客户端和服务器之间的交互
Resources
介绍
HiveServer2 (HS2)是一种允许客户端对Hive执行查询的服务。HiveServer2是HiveServer1的继承者,HiveServer1已经被弃用。HS2支持多客户机并发和身份验证。它旨在为JDBC和ODBC等开放API客户机提供更好的支持。
HS2是作为复合服务运行的单个进程,它包括基于thrift的Hive服务(TCP或HTTP)和用于web UI的Jetty web服务器。
HS2 架构
基于thrift的Hive服务是HS2的核心,负责服务Hive查询(例如,从Beeline)。Thrift是一个用于构建跨平台服务的RPC框架。它的栈由4层组成:服务器层、传输层、协议层和处理器层。您可以在https://thrift.apache.org/docs/concepts中找到关于这些层的更多细节。
下面将描述这些层在HS2实现中的用法。
Server--服务器层
HS2对TCP模式使用TThreadPoolServer(来自Thrift),对HTTP模式使用Jetty服务器。
TThreadPoolServer为每个TCP连接分配一个工作线程。每个线程总是与一个连接相关联,即使该连接是空闲的。因此,由于大量并发连接导致大量线程,可能会导致潜在的性能问题。将来,HS2可能会切换到另一种服务器类型,以支持TCP模式,例如TThreadedSelectorServer。下面是一篇关于不同Thrift Java服务器之间性能比较的文章。
Transport--传输层
当客户机和服务器之间需要代理时(例如,出于负载平衡或安全原因),就需要HTTP模式。这就是为什么支持它以及TCP模式。您可以通过Hive配置属性hiv .server .transport.mode指定Thrift 服务的传输模式。
Protocol--协议层
协议实现负责序列化和反序列化。HS2目前使用TBinaryProtocol作为其序列化的Thrift协议。在未来,可以考虑基于更多性能评估的其他协议,如TCompactProtocol。
Processor
流程实现是处理请求的应用程序逻辑。例如,ThriftCLIService.ExecuteStatement()方法实现了编译和执行Hive查询的逻辑。
HS2的依赖关系
- Metastore
可以将metastore配置为嵌入式(在与HS2相同的进程中)或远程服务器(也是基于thriaft的服务)。HS2与metastore对话,获取查询编译所需的元数据。
- Hadoop集群
HS2为各种执行引擎(MapReduce/Tez/Spark)准备物理执行计划,并将作业提交给Hadoop集群执行。
JDBC 客户端
建议客户端使用JDBC驱动程序与HS2进行交互。请注意,在一些用例中(例如Hadoop Hue), Thrift客户机被直接使用,而JDBC被绕过。
下面是进行第一个查询所涉及的一系列API调用:
JDBC客户机(例如,Beeline)创建一个HiveConnection,方法是先启动一个传输连接(例如,TCP连接),然后调用OpenSession API来获取一个SessionHandle。会话是从服务器端创建的。
执行HiveStatement(遵循JDBC标准),并从Thrift客户机发出ExecuteStatement API调用。在API调用中,SessionHandle信息连同查询信息一起传递给服务器。
HS2服务器接收请求并请求驱动程序(命令处理器)进行查询解析和编译。驱动程序启动一个后台作业,该作业将与Hadoop通信,然后立即向客户机返回响应。这是ExecuteStatement API的异步设计。响应包含一个从服务器端创建的操作句柄。
客户端使用OperationHandle与HS2对话,以轮询查询执行的状态。
源代码描述
下面的部分将帮助您在源代码中找到HiveServer2的一些基本组件。
源代码描述
下面的部分将帮助您在源代码中找到HiveServer2的一些基本组件。
服务器端
TCLIService的Thrift IDL文件:https://github.com/apache/hive/blob/master/servicerpc/if/tcliservice.thrift。
TCLIService.Iface由:org.apache.hive.service.cli.thrift.ThriftCLIService 实现类。
ThriftCLIService子类:org.apache.hive.service.cli.thrift.ThriftBinaryCLIService org.apache.hive.service.cli.thrift.ThriftHttpCLIService分别用于TCP模式和HTTP模式。
org.apache.hive.service.cli.thrift.EmbeddedThriftBinaryCLIService类:HS2的嵌入式模式。不要与嵌入式metastore混淆,这是一个不同的服务(尽管嵌入式模式的概念是相似的)。
org.apache.hive.service.cli.session.HiveSessionImpl类:该类的实例在服务器端创建,并由org.apache.accumulo.tserver.TabletServer.SessionManager实例管理。
org.apache.hive.service.cli.operation.Operation class:定义一个操作(例如,查询)。该类的实例在服务器上创建,并由org.apache.hive.service.cli.operation.OperationManager i实例管理。
org.apache.hive.service.auth。HiveAuthFactory类:HTTP和TCP模式都用于身份验证的助手。请参考为各种身份验证选项(特别是身份验证/安全配置和基于Cookie的身份验证)设置HiveServer2。
客户端
- org.apache.hive.jdbc.HiveConnection class: java.sql.Connection连接接口的实现类(JDBC的一部分)。该类的一个实例持有对SessionHandle实例的引用,该实例在对服务器进行Thrift API调用时检索。
- org.apache.hive.jdbc.HiveStatement class:实现了java.sql。语句接口(JDBC的一部分)。客户机(例如,直线)为查询调用HiveStatement.execute()方法。在execute()方法中,Thrift客户机用于进行API调用。
- org.apache.hive.jdbc.HiveDriver class: 实现了java.sql。驱动程序接口(JDBC的一部分)。核心方法是connect(), JDBC客户机使用它来启动SQL连接。
客户端和服务器之间的交互
- org.apache.hive.service.cli.SessionHandle class: 会话标识符。该类的实例从服务器返回,并由客户机用作Thrift API调用的输入。
- org.apache.hive.service.cli.OperationHandle class: 操作标识符。该类的实例从服务器返回,客户端使用该类来轮询操作的执行状态。
Resources
如何设置HS2:设置HiveServer2
HS2客户:HiveServer2客户
用户界面:HiveServer2的Web UI
指标:Hive的Metrics
Cloudera博客:http://blog.cloudera.com/blog/2013/07/how-hiveserver2-brings-secur-andconcurrenctoapache-hive/
您可以在这里找到HS2及其依赖项之间的交互关系图。