Introduction
HiveServer2(HS2)是一项服务,使 Client 端能够对 Hive 执行查询。 HiveServer2 是不推荐使用的HiveServer1的后继产品。 HS2 支持多 Client 端并发和身份验证。它旨在为 JDBC 和 ODBC 等开放 APIClient 端提供更好的支持。
HS2 是作为复合服务运行的单个进程,其中包括基于 Thrift 的 Hive 服务(TCP 或 HTTP)和用于 Web UI 的Jetty Web 服务器。
HS2 Architecture
基于 Thrift 的 Hive 服务是 HS2 的核心,并负责为 Hive 查询提供服务(例如,来自 Beeline)。 Thrift是用于构建跨平台服务的 RPC 框架。它的堆栈由 4 层组成:服务器,传输,协议和处理器。您可以在https://thrift.apache.org/docs/concepts找到有关图层的更多详细信息。
HS2 实现中这些层的用法如下所述。
Server
HS2 将 TThreadPoolServer(来自 Thrift)用于 TCP 模式,或将 Jetty 服务器用于 HTTP 模式。
TThreadPoolServer 为每个 TCP 连接分配一个工作线程。每个线程始终与一个连接相关联,即使该连接处于空闲状态也是如此。因此,由于大量并发连接,大量线程导致了潜在的性能问题。将来,HS2 可能会切换到另一种用于 TCP 模式的服务器类型,例如 TThreadedSelectorServer。这是有关不同 Thrift Java 服务器之间性能比较的article。
Transport
当 Client 端和服务器之间需要代理时(例如,出于负载平衡或安全原因),需要使用 HTTP 模式。这就是为什么支持它以及 TCP 模式的原因。您可以通过 Hive 配置属性hive.server2.transport.mode指定 Thrift 服务的传输模式。
Protocol
协议实现负责序列化和反序列化。 HS2 当前正在使用 TBinaryProtocol 作为 Thrift 协议进行序列化。将来,基于更多的性能评估,可能会考虑其他协议,例如 TCompactProtocol。
Processor
流程实现是处理请求的应用程序逻辑。例如,ThriftCLIService.ExecuteStatement()方法实现了用于编译和执行 Hive 查询的逻辑。
HS2 的依存关系
-
Metastore
可以将元存储库配置为嵌入式(与 HS2 相同的过程)或远程服务器(也基于 Thrift 的服务)。 HS2 与元存储区对话以获取查询编译所需的元数据。 -
Hadoop cluster
HS2 为各种执行引擎(MapReduce/Tez/Spark)准备物理执行计划,并将作业提交到 Hadoop 集群以执行。
您可以找到 HS2 及其依赖关系here之间的交互关系图。
JDBC Client
建议 Client 端使用 JDBC 驱动程序与 HS2 进行交互。请注意,在某些用例(例如Hadoop Hue)中,直接使用 ThriftClient 端而绕过 JDBC。
这是进行第一个查询所涉及的一系列 API 调用:
-
JDBCClient 端(例如 Beeline)通过启动传输连接(例如 TCP 连接),然后发起 OpenSession API 调用来获取 SessionHandle,从而创建 HiveConnection。会话是从服务器端创建的。
-
执行 HiveStatement(遵循 JDBC 标准),并从 ThriftClient 端进行 ExecuteStatement API 调用。在 API 调用中,SessionHandle 信息与查询信息一起传递到服务器。
-
HS2 服务器接收该请求,并请求驱动程序(它是 CommandProcessor)进行查询解析和编译。驱动程序启动将与 Hadoop 对话的后台作业,然后立即将响应返回给 Client 端。这是 ExecuteStatement API 的异步设计。响应包含从服务器端创建的 OperationHandle。
-
Client 端使用 OperationHandle 与 HS2 对话以轮询查询执行的状态。
源代码说明
以下各节可帮助您在源代码中找到 HiveServer2 的一些基本组件。
Server Side
-
TCLIService 的节俭 IDL 文件 :https://github.com/apache/hive/blob/master/service-rpc/if/TCLIService.thrift。
-
TCL IService .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 实例.*Management
-
org.apache.hive.service.cli.operation.Operation 类 :定义一个操作(例如查询)。此类的实例是在服务器上创建的,并由* org.apache.hive.service.cli.operation.OperationManager 实例.*Management
-
org.apache.hive.service.auth.HiveAuthFactory 类 :HTTP 和 TCP 模式用于身份验证的帮助程序。有关各种身份验证选项,请参阅设置 HiveServer2,尤其是Authentication/Security Configuration和基于 Cookie 的身份验证。
Client Side
-
org.apache.hive.jdbc.HiveConnection 类 : **** 实现 **** **** * java.sql.Connection *接口(JDBC 的一部分) *.此类包含对 SessionHandle 实例的引用,该实例在对服务器.*进行 Thrift API 调用时会检索到。
-
org.apache.hive.jdbc.HiveStatement 类: 实现* java.sql.Statement 接口(JDBC 的一部分)。Client 端(例如 Beeline)为查询调用 HiveStatement.execute()方法。在 execute *()方法内部,ThriftClient 端用于进行 API 调用。
-
org.apache.hive.jdbc.HiveDriver 类 :实现* java.sql.Driver 接口(JDBC 的一部分).核心方法是 connect *(),JDBCClient 端使用它来启动 SQL 连接。
Client 端和服务器之间的交互
-
org.apache.hive.service.cli.SessionHandle 类: 会话标识符. **** 此类的实例从服务器返回,并由 Client 端用作 Thrift API 调用*.*的 Importing。
-
org.apache.hive.service.cli.OperationHandle 类 :操作标识符。此类的实例从服务器返回,并由 Client 端用于轮询操作的执行状态。
Resources
如何设置 HS2:设置 HiveServer2
HS2Client:HiveServer2 Clients
用户界面:HiveServer2 的 Web UI
Metrics: Hive Metrics
HS2 上的 Cloudera 博客:http://blog.cloudera.com/blog/2013/07/how-hiveserver2-brings-security-and-concurrency-to-apache-hive/