翻译: https://cwiki.apache.org/confluence/display/Hive/Setting+Up+HiveServer2
版本: 2.3.3
HiveServer2
HiveServer2(HS2)是服务器接口,使远程客户端执行对hive的查询和检索结果(更详细的介绍这里)。目前基于Thrift RPC的实现,是HiveServer的改进版本,并支持多客户端并发和身份验证。它旨在为JDBC和ODBC等开放API客户端提供更好的支持。
- HiveServer2的Thrift接口定义语言(IDL)可在https://github.com/apache/hive/blob/trunk/service/if/TCLIService.thrift上找到。
- Thrift文档可在http://thrift.apache.org/docs/获得。
本文档介绍如何设置服务器。HiveServer2客户端文档中描述了如何使用客户端。
如何配置
hive-site.xml
文件中的配置属性
hive.server2.thrift.min.worker.threads - 工作线程的最小数量,默认为5。
hive.server2.thrift.max.worker.threads - 最大工作线程数,默认值为500。
hive.server2.thrift.port - 侦听的TCP端口号,默认为10000。
hive.server2.thrift.bind.host - 绑定到的TCP接口。
有关可以为HiveServer2设置的其他属性,请参阅“配置属性”文档中的HiveServer2。
可选的环境设置
HIVE_SERVER2_THRIFT_BIND_HOST - 要绑定的可选TCP主机接口。覆盖配置文件设置。
HIVE_SERVER2_THRIFT_PORT - 要侦听的可选TCP端口号,默认为10000.覆盖配置文件设置。
以HTTP模式运行
HiveServer2支持通过HTTP传输发送Thrift RPC消息(Hive 0.13以上,请参阅HIVE-4752)。这对于支持客户端和服务器之间的代理中介(例如,出于负载平衡或安全原因)特别有用。目前,您可以在TCP模式或HTTP模式下运行HiveServer2,但不能同时运行这两种模式。对于相应的JDBC URL,请检查此链接:HiveServer2客户端 - JDBC连接URL。使用以下设置启用和配置HTTP模式:
设置 | 默认 | 描述 |
---|---|---|
hive.server2.transport.mode | binary | 设置为http以启用HTTP传输模式 |
hive.server2.thrift.http.port | 10001 | 要监听的HTTP端口号 |
hive.server2.thrift.http.max.worker.threads | 500 | 服务器池中的最大工作线程数 |
hive.server2.thrift.http.min.worker.threads | 5 | 服务器池中的最小工作线程数 |
hive.server2.thrift.http.path | cliservice | 服务端点(service endpoint) |
基于Cookie的认证
HIVE-9709和HIVE-9710在HTTP模式下为HiveServer2引入了基于cookie的认证。可以在此处找到与此更改相关的HiveServer2参数(hive.server2.thrift.http.cookie.*)。
可选全局初始化文件
全局init文件可以放置在配置的 hive.server2.global.init.file.location位置(Hive 0.14以后,参见HIVE-5160,HIVE-7497和HIVE-8138)。这可以是init文件本身的路径,也可以是包含名为“.hiverc”的目录。
init文件列出了一组将为此HiveServer2实例的用户运行的命令,例如注册一组标准的jar和函数。
日志配置
HiveServer2操作日志可用于Beeline客户端(Hive 0.14以上)。这些参数配置记录:
- hive.server2.logging.operation.enabled
- hive.server2.logging.operation.log.location
- hive.server2.logging.operation.verbose (Hive 0.14到1.1)
- hive.server2.logging.operation.level (Hive 1.2以上)
如何开始
$HIVE_HOME/bin/hiveserver2
OR
$HIVE_HOME/bin/hive --service hiveserver2
Usage信息
-H
或--help
选项显示用法消息,例如:
`$HIVE_HOME/bin/hive --service hiveserver2 -H`
`Starting HiveServer2`
`usage: hiveserver2`
`-H,--help Print help information`
`--hiveconf <property=value> Use value for given property`
认证/安全配置
HiveServer2支持匿名(不启用认证)和使用SASL,Kerberos(GSSAPI),通过LDAP,可插入自定义认证和可插入认证模块(PAM,支持Hive 0.13以上)。
配置
认证模式:
hive.server2.authentication - 身份验证模式,默认为NONE。可选项是NONE(使用普通SASL),NOSASL,KERBEROS,LDAP,PAM和CUSTOM。设置启用KERBEROS模式:
hive.server2.authentication.kerberos.principal - 服务器的Kerberos主体。
hive.server2.authentication.kerberos.keytab - 服务器主体的Keytab。
- 设置LDAP模式的以下内容:
hive.server2.authentication.ldap.url - LDAP URL(例如,ldap://hostname.com:389)。
hive.server2.authentication.ldap.baseDN - LDAP基本DN。(对AD可选)
hive.server2.authentication.ldap.Domain - LDAP域。(Hive 0.12.0及更高版本)。
有关 Hive 1.3.0及更高版本中的其他LDAP配置参数,请参阅HiveServer2中的LDAP Atn Provider的用户和组过滤器支持。
- 设置自定义模式:
hive.server2.custom.authentication.class - 实现org.apache.hive.service.auth.PasswdAuthenticationProvider
接口的定制认证类。
- 对于PAM模式,请参阅下面关于PAM的章节。
Impersonation
默认情况下,HiveServer2以提交查询的用户身份执行查询处理。但是,如果以下参数设置为false,则查询将以运行hiveserver2
进程的用户身份运行。
hive.server2.enable.doAs - 模拟连接的用户,默认为true。
要防止在不安全模式下发生内存泄漏,请通过将以下参数设置为true来禁用文件系统缓存(请参阅 HIVE-4501):
fs.hdfs.impl.disable.cache - 禁用HDFS文件系统缓存,默认为false。
fs.file.impl.disable.cache - 禁用本地文件系统缓存,默认为false。
完整性/机密性保护*
Hive JDBC驱动程序与HiveServer2之间进行通信的完整性保护和机密性保护(不仅仅是缺省认证)已启用(Hive 0.12以上,请参阅HIVE-4911)。您可以使用SASL QOP属性来配置它。
- 这仅在Kerberos用于HiveServer2的HS2客户端(JDBC / ODBC应用程序)身份验证时使用。
-
hive-site.xml
必须将hive.server2.thrift.sasl.qop 设置为有效的QOP值之一('auth','auth-int'或'auth-conf')。
SSL加密
支持SSL加密(Hive 0.13以上,请参阅 HIVE-5351)。要启用,请在以下位置设置以下配置 hive-site.xml
:
hive.server2.use.SSL - 将其设置为true。
hive.server2.keystore.path - 将其设置为您的密钥库路径。
hive.server2.keystore.password - 将其设置为您的密钥库密码。
注意
当hive.server2.transport.mode是binary并且hive.server2.authentication是KERBEROS时,SSL加密在Hive 2.0之前不起作用。将hive.server2.thrift.sasl.qop设置为auth-conf以启用加密。详情请参阅HIVE-14019。
使用自签名证书设置SSL
使用以下步骤创建并验证用于HiveServer2的自签名SSL证书:
使用以下命令创建自签名证书并将其添加到密钥库文件: keytool -genkey -alias example.com -keyalg RSA -keystore keystore.jks -keysize 2048,确保自签名证书中使用的名称与HiveServer2将运行的主机名相匹配。
列出密钥库条目以验证是否添加了证书。请注意,密钥库可以包含多个此类证书:keytool -list -keystore keystore.jks
将此证书从keystore.jks导出到证书文件:keytool -export -alias example.com -file example.com.crt -keystore keystore.jks
将此证书添加到客户端的信任库以建立信任关系:keytool -import -trustcacerts -alias example.com -file example.com.crt -keystore truststore.jks
验证truststore.jks中是否存在证书:keytool -list -keystore truststore.jks
然后启动HiveServer2,并尝试使用以下命令连接直线: jdbc:hive2://<host>:<port>/<database>;ssl=true;sslTrustStore=<path-to-truststore>;trustStorePassword=<truststore-password>
选择性地禁用SSL协议版本
要禁用特定的SSL协议版本,请使用以下步骤:
- 运行openssl ciphers -v(或者不使用openssl的相应命令)查看所有协议版本。
- 除了1之外,可能还需要执行额外的步骤来查看HiveServer2日志,以查看运行HiveServer2的节点支持的所有协议。为此,请在HiveServer2日志文件中搜索“启用SSL服务器套接字的协议:”。
- 将所有需要禁用的SSL协议添加到hive.ssl.protocol.blacklist。确保hiveserver2-site.xml中的属性不覆盖hive-site.xml中的属性。
可插入认证模块(PAM)
警告
如果用户的密码已过期,用于提供PAM身份验证模式的JPAM库可能会导致HiveServer2关闭。发生这种情况是因为JPAM调用本地代码的segfault / core转储。在其他情况下,某些用户也在登录过程中报告了崩溃。建议使用LDAP或KERBEROS。
PAM提供了支持(Hive 0.13,参见HIVE-6466)。配置PAM:
- 下载 相关体系结构的JPAM 本机库。
- 解压并将libjpam.so复制到系统上的目录(<libjmap-directory>)。
- 将目录添加到LD_LIBRARY_PATH环境变量中,如下所示:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<libjmap-directory>
- 对于某些PAM模块,您必须确保运行HiveServer2进程的用户可以读取您的文件
/etc/shadow
和/etc/login.defs
文件。
最后,在以下位置设置以下配置 hive-site.xml
:
hive.server2.authentication - 将其设置为PAM。
hive.server2.authentication.pam.services - 将其设置为将使用的以逗号分隔的PAM服务列表。请注意,名称与PAM服务同名的文件必须存在于/etc/pam.d中。
设置HiveServer2作业凭证提供程序
启动Hive 2.2.0(参见 HIVE-14822)Hiveserver2支持MR和Spark作业的作业特定hadoop凭证提供程序。当通过Hadoop Credential Provider使用加密密码时,HiveServer2需要将足够的信息转发到作业配置,以便跨群集启动的作业可以读取这些秘密。此外,HiveServer2可能具有作业不应该具有的秘密,例如Hive Metastore数据库密码。如果你的工作需要访问这些秘密,比如S3凭证,那么你可以使用下面的配置步骤来配置它们:
- 在HDFS中的安全位置使用Hadoop Credential Provider API创建特定于作业的密钥库。此密钥库应包含作业所需配置的加密密钥/值对。例如:对于S3凭证,密钥库应该包含fs.s3a.secret.key和fs.s3a.access.key及其相应的值。
- 解密密钥库的密码应设置为名为HIVE_JOB_CREDSTORE_PASSWORD的HiveServer2环境变量
- 将hive.server2.job.credential.provider.path设置 为URL,指向上面(1)中创建的密钥存储的类型和位置。如果没有作业特定的密钥库,则HiveServer2将使用core-site.xml中使用hadoop.credential.provider.path的一个集(如果可用)。
- 如果未提供步骤2中设置的密码使用环境变量,则HiveServer2将使用HADOOP_CREDSTORE_PASSWORD环境变量(如果可用)。
- HiveServer2现在将修改使用MR或Spark执行引擎启动的作业的作业配置,以包含作业凭证提供程序,以便作业任务可以使用秘密访问加密的密钥库。
hive.server2.job.credential.provider.path - 将其设置为您的作业特定的hadoop凭据提供程序。例如:jceks://hdfs/user/hive/secret/jobcreds.jceks。
HIVE_JOB_CREDSTORE_PASSWORD - 将此HiveServer2环境变量设置为上面设置的特定于作业的Hadoop凭据提供程序密码。
临时目录管理
HiveServer2允许配置Hive用来存储临时输出和计划的暂存目录的各个方面。
配置属性
以下是可以配置与临时目录相关的属性:
ClearDanglingScratchDir工具
可以运行Cleardanglingscratchdir工具来清理Hive不正常关闭时可能遗留的任何悬挂临时目录,例如当虚拟机重新启动并且Hive无法运行关闭挂钩时。
hive --service cleardanglingscratchdir [-r] [-v] [-s scratchdir]
-r dry-run mode, which produces a list on console
-v verbose mode, which prints extra debugging information
-s if you are using non-standard scratch directory
该工具测试是否正在使用暂存目录,如果没有,将删除它。这依赖于HDFS写锁定来检测暂存目录是否正在使用中。HDFS客户端打开一个HDFS文件($scratchdir/inuse.lck
)进行写入,并且仅在会话关闭时关闭它。cleardanglingscratchdir将尝试打开$scratchdir/inuse.lck
以测试相应的HiveCli / HiveServer2是否仍在运行。如果锁正在使用中,则暂存目录不会被清除。如果锁定可用,则暂存目录将被清除。请注意,NameNode最多可能需要10分钟才能从死亡的HiveCli / HiveServer2中收回临时文件锁定的契约,届时cleardanglingscratchdir将能够在再次运行时将其删除。
HiveServer2的Web UI
版
在Hive 2.0.0中引入。参见HIVE-12338及其子任务。
HiveServer2的Web用户界面(UI)提供配置,日志记录,指标和活动会话信息。默认情况下,Web UI在端口10002(127.0.0.1:10002)可用。
- 可以在hive-site.xml中自定义 Web UI的配置属性,包括hive.server2.webui.host,hive.server2.webui.port,hive.server2.webui.max.threads和其他。
- 配置单元度量标准可以通过使用“度量转储”选项卡进行查看。
- 日志 可以通过使用“本地日志”选项卡中查看。
该界面目前正在开发 HIVE-12338。
Python客户端驱动
HiveServer2的Python客户端驱动程序可在 https://github.com/BradRuderman/pyhs2上找到 (谢谢Brad)。它包括所有必需的软件包,如SASL和Thrift包装。
该驱动程序已经通过了Python 2.6及更新版本的认证。
要使用pyhs2驱动程序:
pip install pyhs2
`import` `pyhs2`
`with [pyhs2.connect(host](https://cwiki.apache.org/confluence/display/Hive/pyhs2.connect(host)``=``'localhost'``,`
`port``=``10000``,`
`authMechanism``=``"PLAIN"``,`
`user``=``'root'``,`
`password``=``'test'``,`
`database``=``'default'``) as conn:`
`with [conn.cursor()](https://cwiki.apache.org/confluence/display/Hive/conn.cursor()) as cur:`
`#Show databases`
`print` `[cur.getDatabases()](https://cwiki.apache.org/confluence/display/Hive/cur.getDatabases())`
`#Execute query`
`[cur.execute(](https://cwiki.apache.org/confluence/display/Hive/cur.execute()``"select * from table"``)`
`#Return column info from query`
`print` `[cur.getSchema()](https://cwiki.apache.org/confluence/display/Hive/cur.getSchema())`
`#Fetch table results`
`for` `i ``in` `[cur.fetch():](https://cwiki.apache.org/confluence/display/Hive/cur.fetch():)`
`print` `i`
您可以在user@hive.apache.org邮件列表上讨论此驱动程序 。
Ruby客户端驱动
在https://github.com/forward3d/rbhive上的github上提供了一个Ruby客户端驱动程序 。