On this page
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/