目录

 

介绍

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 classjava.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及其依赖项之间的交互关系图。