接下来就是对hive进行环境配置了,对于hive,我的一般使用方式是使用远程的mysql做为源数据服务器。而不使用hive自带的matestore服务器,貌似后者能支持更大的并发,这个暂时没需求就简单的来,除了元数据库还有一个重点就是数据仓库地址,我配置的我的个人用户intern的目录/user/intern,具体配置如下:
hive.metastore.warehouse.dir /user/intern/ location of default database for the warehouse javax.jdo.option.ConnectionURL jdbc:mysql://127.0.0.1:3306/HIVE JDBC connect string for a JDBC metastore javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver Driver class name for a JDBC metastore javax.jdo.option.ConnectionUserName root username to use against metastore database javax.jdo.option.ConnectionPassword root password to use against metastore database
接下来还需要配置一些关于kerberos认证的东西,具体的配置内容如下:
hive.server2.authentication KERBEROS Client authentication types. NONE: no authentication check LDAP: LDAP/AD based authentication KERBEROS: Kerberos/GSSAPI authentication CUSTOM: Custom authentication provider (Use with property hive.server2.custom.authentication.class) PAM: Pluggable authentication module. hive.server2.authentication.kerberos.principal hive/xxx@HADOOP.XXX.COM Kerberos server principal hive.server2.authentication.kerberos.keytab /home/hzfengyu/hive.keytab Kerberos keytab file for server principal
这三个配置项分别是配置hiveserver2的认证方式,如果配置不得当客户端会出现很多问题,默认情况下认证方式是CUSTOM,这里我们配置成KERBEROS,然后配置kerberos认证需要的keytab文件和principal,一般情况下我们执行kinit也就是需要这两样东西,不过不同的是这里的principal需要指定完成的,而不只是@符号前面的东西(kinit的时候只指定前面的东西就可以了),另外需要注意的是这里的keytab对应的用户必须在hadoop上具有可代理执行的权限,这是hiveserver2所需要的,也就是说其实hiveserver2只是一个指定代理的服务器,不同的用户通过jdbc连接到hiveserver2,根据客户端不同的keytab用户代理不同的用户执行具体的操作。如果该用户没有代理的权限,在使用jdbc和hiveserver2建立连接的时候会出现认证错误,错误的堆栈为:
15/05/01 17:32:33 [main]: ERROR transport.TSaslTransport: SASL negotiation failure javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials pro