一、简介
学习和实践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默认都开启了)
![](https://img.haomeiwen.com/i3914628/e806b8b4f57f4174.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();
}
}
>
网友评论