hiveserver2-CDH版本客户端使用

一、简介

学习和实践Hive中,使用的都是CLI或者hive –e的方式,该方式仅允许使用HiveQL执行查询、更新等操作,并且该方式比较笨拙单一。幸好Hive提供了轻客户端的实现,通过HiveServer或者HiveServer2,客户端可以在不启动CLI的情况下对Hive中的数据进行操作,两者都允许远程客户端使用多种编程语言如Java、Python向Hive提交请求,取回结果。HiveServer或者HiveServer2都是基于Thrift的,但HiveSever有时被称为Thrift server,而HiveServer2却不会。既然已经存在HiveServer为什么还需要HiveServer2呢?这是因为HiveServer不能处理多于一个客户端的并发请求,这是由于HiveServer使用的Thrift接口所导致的限制,不能通过修改HiveServer的代码修正。因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2,进而解决了该问题。HiveServer2支持多客户端的并发和认证,为开放API客户端如JDBC、ODBC提供了更好的支持。

二、修改hive-site.xml

<property>  
  <name>hive.server2.thrift.port</name>  
  <value>10000</value>  
</property>  
<property>  
  <name>hive.server2.thrift.bind.host</name>  
  <value>slave1</value> <!-- 默认是localhost,但我手动改成了本机的地址 -->  
</property> 

CDH中修改(应该都不需要配置CDH5.10默认都开启了)


Paste_Image.png

三、启动

CDH中已经启动,可忽略此操作

$HIVE_HOME/bin/hive --service hiveserver2 

四、测试连接

#由于没有配置密码,所以默认user为default,密码为null
[root@slave1 bin]# ./beeline 
Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release
Beeline version 1.1.0-cdh5.10.0 by Apache Hive
beeline> !connect jdbc:hive2://slave1:10000 -udefault
scan complete in 1ms
Connecting to jdbc:hive2://slave1:10000
Enter password for jdbc:hive2://slave1:10000: 
Connected to: Apache Hive (version 1.1.0-cdh5.10.0)
Driver: Hive JDBC (version 1.1.0-cdh5.10.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://slave1:10000> 
0: jdbc:hive2://slave1:10000> show databases;
INFO  : Compiling command(queryId=hive_20170414150606_500d6a49-96cc-4f52-9994-8a95830fe887): show databases
INFO  : Semantic Analysis Completed
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=hive_20170414150606_500d6a49-96cc-4f52-9994-8a95830fe887); Time taken: 0.004 seconds
INFO  : Executing command(queryId=hive_20170414150606_500d6a49-96cc-4f52-9994-8a95830fe887): show databases
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=hive_20170414150606_500d6a49-96cc-4f52-9994-8a95830fe887); Time taken: 0.01 seconds
INFO  : OK
+----------------+--+
| database_name  |
+----------------+--+
| cards          |
| default        |
| testsqoop      |
| tonghang       |
+----------------+--+
5 rows selected (0.1 seconds)
0: jdbc:hive2://slave1:10000> 

至此,hiveserver2搭建成功

五、客户端连接

1、pom.xml文件增加依赖

由于使用CDH版本,所以maven依赖都是依赖的cdh版本

<!-- 连接hive所需依赖 -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>1.1.0-cdh5.10.0</version> 
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-core</artifactId>
            <version>2.6.0-mr1-cdh5.10.0</version>  
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.6.0-cdh5.10.0</version>  
        </dependency>

2、代码

package com.chainfin.hive;
>
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
>
public class TestConnHive {
    private static String driverName = "org.apache.hive.jdbc.HiveDriver";
>
    public static void main(String[] args) throws SQLException {
        try {
            Class.forName(driverName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.exit(1);
        }
        Connection conn = DriverManager.getConnection(
                "jdbc:hive2://slave1:10000/testsqoop", "default", "");
        Statement stmt = conn.createStatement();
        ResultSet res = null;
        String sql = "select * from dydata limit 1";
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1));
            System.out.println(res.getString(2));
            System.out.println(res.getString(3));
            System.out.println(res.getString(4));
        }
        conn.close();
    }
}
>

推荐阅读更多精彩内容