基于0.14.0版本配置HiveServer2(一)

2015-07-24 07:02:28 · 作者: · 浏览: 4
项目中需要访问hive作为mondrian的异种数据源执行MDX查询,而我一般使用hive的时候都是直接通过hive命令行的方式直接执行SQL,或者通过hive的jar包在程序中访问,在这种方式的使用过程中,访问的hadoop集群都是公司的集群,之前测试hive的过程中记得自己对hive的jdbc 源码进行了修改,主要是修改了一些hive在实现jdbc中没有实现但是抛出异常的接口,而mondrian会调用这些接口导致下面的流程走不下去了,整体的修改应该说还是比较简单的。另外一个问题是当时的hive是没有使用任何认证机制的,包括hadoop也是没有认证机制的,现在在公司的hadoop集群上跑需要使用kerberos认证,这一块自己还不熟悉,还只是知道怎么用,所以还需要恶补了一下关于kerberos认证的知识。 下面介绍一下我对hive几种使用方式的理解,首先是hive的元 数据库,它分为三种形式的,第一种是内嵌的derby数据库,这种方式由于derby会在当前目录创建一个目录,所以智能启动一个hive实例,第二种方式是使用远程数据库,也就是使用一个关系数据库系统,例如 mysql等(目前只测试了mysql),hive通过jdbc连接mysql获取元数据信息,还有一种方式是hive自带的metaserver,这个server是用来关系元数据的,相当于在真正的元数据管理器之前又搭了一个服务。 在使用的过程中主要有两种方式使用hive,第一种就是仅仅把hive作为一个可以对文件使用SQL查询的根据来使用,也就是直接使用hive命令行,亦或者在程序中使用hive提供的函数启动,在这种情况下我们只需要配置好hive元数据服务器(告诉hive存储了哪些数据库和表以及其属性)和hive的数据仓库目录(一般是一个HDFS的目录),经过测试数据仓库的目录只是在创建数据库的时候有作用,在创建表的时候会在所在数据库的目录下创建表的目录,另外还需要指定hadoop的配置文件和jar包,毕竟hive依赖于hadoop执行任务。 第二种方式就是讲hive作为一个提供了SQL接口的数据库使用,我们可以通过jdbc的方式访问它,类似于使用mysql的方式,本文主要介绍的就是如何配置这个服务器并且使用hive自带的客户端以及使用jdbc的方式连接使用。

接下来就是对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
   

  

另外,这里对于hive元数据的创建还需要注意一下,一般情况下我们会选择使用utf8作为数据库默认的字符集(应该是为了支持中文),但是如果你使用utf8字符集hive会出现很多莫名其妙的错误,让人摸不到头脑,所以需要再创建hive数据库的时候需要指定字符集为latin1,另外还可以让hive自动帮你创建(我没有尝试过,不知道是否可行)。
接下来还需要配置一些关于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