HiveServer2的客户端

本文翻译自hive官网
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients
前面的我都用过的,但是从kerberos认证之后,我就没使用过了。如果感觉翻译有疑问,请看源文档哈。
Beeline-一个新命令行客户端
Beeline的列子
Beeline的命令
Beeline的hive命令
Beeline命令行参数
分割符输出格式
HiveServer2的日志
JDBC
连接的urls
连接URL的格式
远程连接URL或者本地模式
当HiverServer2运行在HTTP模式中的连接URL
当在HiverServer2的SSL已经启动的时候的连接URL
使用JDBC
JDBC客户端的简单代码
运行JDBC客户端简单代码
JDBC的数据类型
对于安全的集群,JDBC的客户端设置
多用户场景和自动登录到Kerberos kdc
使用kerberos的预认证
Python客户端
Ruby客户端
与SQuirrel Sql集成
与Dbvissoftware的Dbvisualizer集成
集成其他工具的高级特征
在HTTP模式中支持Cookie的重置
在HTTP模式中可以使用双向的ssl
通过jdbc的驱动,传输http头的key-value数据

这篇文章描述了不同的支持hiveserver2的客户端
Beeline-一个新命令行客户端
hiveserver2支持一个新的shell客户端。它是基于SQLline的客户端的一个jbdc客户端。这里有详细描述documentation,也有利于理解beeline。
beeline客户端支持远程模式和本地模式。在本地模式中,它运行一个本地的hive(类似hive 客户端),然后原创模式中,通过thrift连接一个分离的hiveserver2的进程。在hive0.14之后,在Hiveserver2环境使用beeline,它也从hiverserv2中执行输出标准错误,会打印此日志信息。
ps:在远程模式中,hiveserver2仅仅只支持thrift认证的连接。甚至HTTP模式中,这个消息的body也要包含thrift.
Beeline的列子

% bin/beeline
Hive version 0.11.0-SNAPSHOT by Apache
beeline> !connect jdbc:hive2://localhost:10000 scott tiger org.apache.hive.jdbc.HiveDriver
!connect jdbc:hive2://localhost:10000 scott tiger org.apache.hive.jdbc.HiveDriver
Connecting to jdbc:hive2://localhost:10000
Connected to: Hive (version 0.10.0)
Driver: Hive (version 0.10.0-SNAPSHOT)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000> show tables;
show tables;
+-------------------+
|     tab_name      |
+-------------------+
| primitives        |
| src               |
| src1              |
| src_json          |
| src_sequencefile  |
| src_thrift        |
| srcbucket         |
| srcbucket2        |
| srcpart           |
+-------------------+
9 rows selected (1.079 seconds)

ps:使用没有安全认证的beeline连接,如果你想通过 NOSASL模式连接,你必须明确的指定认证模式

% bin/beeline
beeline> !connect jdbc:hive2://<host>:<port>/<db>;auth=noSasl hiveuser pass org.apache.hive.jdbc.HiveDriver

Beeline的命令

commanddescription
!<’sqlline command’>sqlline的命令,看如下连接的详细信息sqlline,!quit是退出beeline客户端

Beeline的hive命令
在hive的jdbc区中被使用的时候,hive指定命令(和hive客户端命令一样)能够在beeline客户端运行。使用”;”来区分命令。在脚本中的命令使用”–”来识别。

commanddescription
reset重置默认的配置
set key value设置特别的配置变量,如果你的配置变量的名称写错了,beeline客户端不会报错
set -v打印出hadoop和hive的配置变量
add files filepath,add jars filepath,add archives filepath添加一个或者多个文件,jar包,archives包到分布式缓存的资源列表中。看hive resources详情
list files,list jars,list archive列出已经添加进分布式缓存中的资源
list files filepath,list jars filepath,list archives filepath查看是否已经添加进分布式缓存中
delete files path,delete jars path,delete archives path从分布式缓存中移除资源
delete/add files ivyurl,delete/add jars ivyurl,delete/add archives ivyurlivy是apache的依赖管理工具,从hive1.2.0之后,就是可以使用ivy来管理依赖包
reload从hive0.14.0之后,是的hiveserver2明确的知道jar包的变化(在指定的配置文件路径中)hive.reloadable.aux.jars.path。这个变化可能是add,remove,update jar包
query string执行hive的查询语句,然后打印结果到标准输出流

Beeline命令行参数,常用的

选项描述
-u db_urljdbc的url,列如:beeline -u db_url
-n usernamedb连接串的用户名,列如:beeline -n username
-p passworddb连接串的密码,列如:beeline -p password
-d driver class连接的驱动,列如:beeline -d org.apache.hive.jdbc.HiveDriver
-e query被执行的查询语句,查询语句中需要使用双引号和单引号,列如:beeline -e “query_string”
-f filepath运行文件中的脚本
–hiveconf property=value指定配置变量的值,在hive.conf.restricted.list中列出的配置变量是不能够被–hiveconf重置的。看详情restricted list and whitelist
–hivevar name=valuehive的变量,这个可以在hive-specific设置中被指定,可以在session级别指定
–showHeader true/false在查询结果中是否显示列的名字

分割符输出格式
在hive0.14之后,在输出SV格式上有所提升,有DSV,CSV2和TSV2。这些格式比标准的CSV(在包含特殊字符-分隔符,单引号的时候,会在每列中加单引号)好很多。从分布符区分不同,有3中输出格式,逗号-CSV2,tab-TSV2,通过delimiterForDsv属性配置-DSV。
CSV和TSV格式可以向后兼容,但是在输出的每一列中有单引号围绕。
HiveServer2的日志
在hive0.14.0之后,hiveserver2的操作日志对于beeline客户端是可见的。这些配置日志信息如下:
hive.server2.logging.operation.enabled
hive.server2.logging.operation.log.location
hive.server2.logging.operation.verbose (Hive 0.14 to 1.1)
hive.server2.logging.operation.level (Hive 1.2 onward)
在hive2.0.0中添加了日志queryid和sessionid的支持。在配置文件中使用edit/add %X{queryId} and %X{sessionId} 这种通配符查询它。
JDBC
hiveserver2有一个新的jdbc驱动,它支持本地和远程模式接入hiveserver2。
连接URL的格式
hiveserver的url格式如下:

jdbc:hive2://<host1>:<port1>,<host2>:<port2>/dbName;sess_var_list?hive_conf_list#hive_var_list

其中:
host:port1,host:port2是通过逗号分隔的服务器实列,如果开启的了HA,自动切换服务,如果为null,自动使用本地模式连接。
db_name:是数据库的名字。
sess_var_list:是通过分号区分的 key=value定义,这个是seesion级别的变量,比如user=foo;password=bar
hive_conf_list:分号分隔,设置session级别的配置变量
hive_var_list:分号分隔,设置session基本的hive变量
远程连接URL或者本地模式
Jbdc的连接url,有前缀jdbc:hive2://,驱动类为org.apache.hive.jdbc.HiveDriver,注意下这个驱动类和老的hiveserver不同。
在远程模式中,这个url格式如下:jdbc:hive2://host:port/db(默认的端口为10000)
在本地模式中,这个url格式如下: jdbc:hive2://(没有写host和端口)
当HiverServer2运行在HTTP模式中的连接URL
jbdc连接url,

jdbc:hive2://<host>:<port>/<db>;transportMode=http;httpPath=<http_endpoint>

其中
http_endpoint这个对应的HTTP endpoint配置是在hive-site.xml。默认是cliservice。这个模式是基于http传输数据的。
http传输模式的端口默认为10001
在0.14之前的版本中,使用hive.server2.transport.mode和hive.server2.thrift.http.path来分别使用,这是hive_conf_list中的一部分参数。这些版本已经弃用新版的支持了(这些都进入sess_var_list的部分了),但是现在还是可以工作。就是说这个两个参数已经是sess_var_list了。以后设置的话,要在sess_var_list中。
当在HiverServer2的SSL已经启动的时候的连接URL
jdbc连接串url:

dbc:hive2://<host>:<port>/<db>;ssl=true;sslTrustStore=<trust_store_path>;trustStorePassword=<trust_store_password>

其中
trust_store_path:是客户端truststore文件的路径
trust_store_password:是接入truststore的密码
在http模式中:

jdbc:hive2://<host>:<port>/<db>;ssl=true;sslTrustStore=<trust_store_path>;trustStorePassword=<trust_store_password>;transportMode=http;httpPath=<http_endpoint>

就是说在HTTP模式下,连接串如上。
JDBC
你能够使用jdbc来接入数据的存储,步骤如下
1加载hiveserver2的jdbc驱动,在hive1.2.0之后,加载驱动使用的是Class.forName(),列如:

Class.forName("org.apache.hive.jdbc.HiveDriver");

2通过创建连接连接数据库,例如

Connection cnct = DriverManager.getConnection("jdbc:hive2://<host>:<port>", "<user>", "<password>");

默认的端口是10000,在非安全模式下,指定一个用户名就可以运行了。在安全模式下,password可以忽略的。如下:

Connection cnct = DriverManager.getConnection("jdbc:hive2://<host>:<port>", "<user>", "");

在kerberos安全模式中,用户信息是基于kerberos认证的。
3通过创建一个statement对象来提交查询语句,使用executeQuery()执行。列如:

Statement stmt = cnct.createStatement();
ResultSet rset = stmt.executeQuery("SELECT foo FROM bar");

4如果需要,就遍历这个结果集。
这些步骤在如下的一个简单的列子中。

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveJdbcClient {
  private static String driverName = "org.apache.hive.jdbc.HiveDriver";

  /**
   * @param args
   * @throws SQLException
   */
  public static void main(String[] args) throws SQLException {
      try {
      Class.forName(driverName);
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      System.exit(1);
    }
    //replace "hive" here with the name of the user the queries should run as
    Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "hive", "");
    Statement stmt = con.createStatement();
    String tableName = "testHiveDriverTable";
    stmt.execute("drop table if exists " + tableName);
    stmt.execute("create table " + tableName + " (key int, value string)");
    // show tables
    String sql = "show tables '" + tableName + "'";
    System.out.println("Running: " + sql);
    ResultSet res = stmt.executeQuery(sql);
    if (res.next()) {
      System.out.println(res.getString(1));
    }
       // describe table
    sql = "describe " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(res.getString(1) + "\t" + res.getString(2));
    }

    // load data into table
    // NOTE: filepath has to be local to the hive server
    // NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per line
    String filepath = "/tmp/a.txt";
    sql = "load data local inpath '" + filepath + "' into table " + tableName;
    System.out.println("Running: " + sql);
    stmt.execute(sql);

    // select * query
    sql = "select * from " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
    }

    // regular hive query
    sql = "select count(1) from " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(res.getString(1));
    }
  }
}

运行JDBC客户端简单代码

# Then on the command-line
$ javac HiveJdbcClient.java

# To run the program using remote hiveserver in non-kerberos mode, we need the following jars in the classpath
# from hive/build/dist/lib
#     hive-jdbc*.jar
#     hive-service*.jar
#     libfb303-0.9.0.jar
#     libthrift-0.9.0.jar
#     log4j-1.2.16.jar
#     slf4j-api-1.6.1.jar
#     slf4j-log4j12-1.6.1.jar
#     commons-logging-1.0.4.jar
#
#
# To run the program using kerberos secure mode, we need the following jars in the classpath
#     hive-exec*.jar
#     commons-configuration-1.6.jar (This is not needed with Hadoop 2.6.x and later).
#  and from hadoop
#     hadoop-core*.jar
#
# To run the program in embedded mode, we need the following additional jars in the classpath
# from hive/build/dist/lib
#     hive-exec*.jar
#     hive-metastore*.jar
#     antlr-runtime-3.0.1.jar
#     derby.jar
#     jdo2-api-2.1.jar
#     jpox-core-1.2.2.jar
#     jpox-rdbms-1.2.2.jar
# and from hadoop/build
#     hadoop-core*.jar
# as well as hive/build/dist/conf, any HIVE_AUX_JARS_PATH set, 
# and hadoop jars necessary to run MR jobs (eg lzo codec)

$ java -cp $CLASSPATH HiveJdbcClient

上面也了连个中模式下,运行需要的jar包。
或者,你可以通过脚本方式运行,在提交jar文件到客户端前,你需要构建你的classpath和准好好数据文件。这个脚本添加所有的依赖jar包,为了在本地模式也可以可以hiveserver2。

#!/bin/bash
HADOOP_HOME=/your/path/to/hadoop
HIVE_HOME=/your/path/to/hive

echo -e '1\x01foo' > /tmp/a.txt
echo -e '2\x01bar' >> /tmp/a.txt

HADOOP_CORE=$(ls $HADOOP_HOME/hadoop-core*.jar)
CLASSPATH=.:$HIVE_HOME/conf:$(hadoop classpath)

for i in ${HIVE_HOME}/lib/*.jar ; do
    CLASSPATH=$CLASSPATH:$i
done

java -cp $CLASSPATH HiveJdbcClient

JDBC的数据类型
下面是表中的字段数据类型:

hive类型java类型说明
tinyintbyte1字节
smallintshort2字节
intint4字节
bigintlong8字节
floatdouble7位数字
doubledouble15位数字
decimaljava.math.bigdecimal固定精度的10进制
booleanboolean0 or 1
stringstring字符串
timestampjava.sql.timestamp日期和时间值
binraystringbinary
复杂类型
arraystring-json数组
mapstring-jsonkey-value值
structstring-json类似结构体

对于安全的集群,JDBC的客户端设置
当使用kerberso认证连接hiveserver2的时候,连接url格式如下:

jdbc:hive2://<host>:<port>/<db>;principal=<Server_Principal_of_HiveServer2>

在连接hiverserver2的时候,客户端需要拥有一个认证的kerberos ticket。
注意:如果你在端口后面没有”/”,jdbc驱动不会解析hostname,还会终止hiveserver2,使用本地模式连接。如果你指定了hostname,确保你在端口后面,有”/”.
在LDAP(轻量级目录访问协议)中,CUSTOM和PAM认证,客户端需要一个认证的用户米和密码,jdbc来连接。

jdbc:hive://hostname/dbname;sasl.qop=auth-int

看详情setting up hiveserver2
多用户场景和自动登录到Kerberos kdc
在当前使用kerberos的方式中,在连接之前,在ticket缓存中,你需要拥有一个认证的kerberos ticket。Kerberos需要3种方式登录(kinit,key tab和ticketcache),一个kerberos用户的限制登录一个客户端。这些限制限制了在中间系统中和多用户场景中的使用。在多用户场景张,客户端需要自动登录到kerberos的kdc。
解决多用户场景限制的一种方式是,安全代理用户(详情hive-515)。在hive0.13.0之后,有2个组件支持代理用户:
1通过oozie来管理连接的token。这个是hadoop生态圈组件的共性。
2直接使用代理接入到hadoop用户的权限中。这个能是有权限的用户直接指定一个交替的seesion用户-在连接的时候。如果连接用户拥有hadoop级别的权限(模拟的请求userid),hiveserver2将会给这个请求用户运行一个session。
还有种方式是使用 pre-authenticated Kerberos(详看hive-6486)。在这种模式中,住hive0.13.0,这个jbdc的驱动客户端使用pre-authenticated Kerberos来认证用户连接hiveserver2。这能使中间系统如在运行hive客户端那样运行查询语句。
使用kerberos的预认证
使用预认证,你需要做下面几个改变:
1增加hive-exec*.jar到classpath中,(commons-configuration-1.6.jar and hadoop-core*.jar不需要)
2增加auth=kerberos和kerberosAuthType=fromSubject的jdbc连接串的属性
3使用Subject.doAs(),打开连接。
下面是简单的代码使用,详情看hive-6486test case

static Connection getConnection( Subject signedOnUserSubject ) throws Exception{
       Connection conn = (Connection) Subject.doAs(signedOnUserSubject, new PrivilegedExceptionAction<Object>()
           {
               public Object run()
               {
                       Connection con = null;
                       String JDBC_DB_URL = "jdbc:hive2://HiveHost:10000/default;" ||
                                              "principal=hive/localhost.localdomain@EXAMPLE.COM;" ||
                                              "kerberosAuthType=fromSubject";
                       try {
                               Class.forName(JDBC_DRIVER);
                               con =  DriverManager.getConnection(JDBC_DB_URL);
                       } catch (SQLException e) {
                               e.printStackTrace();
                       } catch (ClassNotFoundException e) {
                               e.printStackTrace();
                       }
                       return con;
               }
           });
       return conn;
}

Python客户端
python客户端的驱动在github,安装,请看setting up hiverserver2:python client driver
Ruby客户端
ruby的客户端驱动在github上,https://github.com/forward3d/rbhive
与SQuirrel Sql集成
SQuirrel Sql是一个开源的java客户端工具,能够使用任意的jdbc连接数据库。
1下载,安装,运行SQuirrel SQL,SQuirrel SQL website
输入driver的名字和url


Name: Hive
Example URL: jdbc:hive2://localhost:10000/default

3选择extra class path->add来增加下面的jar包,在本地hive和分布式hadoop环境中。

HIVE_HOME/lib/hive-jdbc-*-standalone.jar
HADOOP_HOME/share/hadoop/common/hadoop-common-*.jar

4选择listDriver,会让SQuirrel使用jdbc驱动解析你的jar包,可能会花几分钟。再class name中填入hive的驱动来连接hiveserver2

org.apache.hive.jdbc.HiveDriver

5点击OK来完成驱动的注册
6选择Aliases->add alias来创建连接hiveserver2实列的别名
a.在Name方框中填入连接的别名
b.从”Driver”中,选择hive的驱动
c.修改url,连接hiveserver2实列
d.输入用户名和密码点击ok保存连接别名
e.双击别名,点击连接来连接上hiveserver2
当连接已经建立了,你将会在日志客户端看到错误。可能会有一个警告:the driver is not jdbc3.0兼容。这是因为jdbc的元数据apiyet-to-be-implemented ,这个可以忽略。为了测试连接,在命名行运行show tables.
注意,当查询开始时,对于取消的支持还没有做。
与Dbvissoftware的Dbvisualizer集成
Dbvisualizer是一个基于jdbc的数据库管理和分析的工具。
1下载,安装,运行免费的或者购买pro.https://www.dbvis.com/
2根据github来做。
集成其他工具的高级特征
下面这些特性,在hive1.2.0之后就支持了。
在HTTP模式中支持Cookie的重置
hive-9709介绍了jdbc驱动的cookie缓存支持。
jdbc的连接url,下成下面这样是有效的。

jdbc:hive2://<host>:<port>/<db>?transportMode=http;httpPath=<http_endpoint>;cookieAuth=true;cookieName=<cookie_name>

cookieAuth模式设为为true。
cookieName:如果安逸的cookies的key匹配上了cookieName,那么jdbc驱动不会发送任何登录凭证和kerberos ticket给服务器。这个客户端可以单独发送cookie给服务器认证。默认的cookieName是hive.server2.auth(这个是hiveserver2的cookie名字)。
为了运行cookie的replay,cookieAuth=false必须使用在url中。
在HTTP模式中可以使用双向的ssl
hive-10447能够使jdbc驱动,在hhtp模式中,支持双向的ssl。注意hiveserver2当前是不支持双向的ssl的。这个特性,在中间服务器中, 比如knox,且knox需要客户端支持双向的ssl,才是可用的。
jdbc,url

jdbc:hive2://<host>:<port>/<db>;ssl=true;twoWay=true;sslTrustStore=<trust_store_path>;trustStorePassword=<trust_store_password>;sslKeyStore=<key_store_path>;keyStorePassword=<key_store_password>?transportMode=http;httpPath=<http_endpoint>

trust_store_path:是客户端truststore文件的路径,不能为null。
trust_store_password:是访问truststore的密码。
key_store_path:是是客户端keystore文件的路径,不能为null。
key_store_password:是接入keystore的密码
通过jdbc的驱动,传输http头的key-value数据
这个特性在hive1.2.0之后才有
hive-10339介绍了一个客户端的选项,用来用户自定义http的header,头信息被发送到底层服务器上。
jdbc的url:

jdbc:hive2://<host>:<port>/<db>;transportMode=http;httpPath=<http_endpoint>;http.header.<name1>=<value1>;http.header.<name2>=<value2>

在上面的url被指定,beeline将会调用底层的request来增加一个http的header,header中设置 name1,value1和name2,value2.当用户需要在http中发送验证信息时,这个功能是很有用的,比如通过beeline来验证的Knox。

http.header.USERNAME=<value1>;http.header.PASSWORD=<value2>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值