0、概述
使用的都是CLI或者hive –e的方式僅允許使用HiveQL執行查詢、更新等操作。然而Hive也提供客戶端的實現,通過HiveServer或者HiveServer2,客戶端可以在不啟動CLI的情況下對Hive中的數據進行操作,兩者都允許遠程客戶端使用多種編程語言如Java、Python向Hive提交請求,取回結果。
HiveServer與HiveServer2的異同?
HiveServer和HiveServer2都是基於Thrift。既然已經存在HiveServer為什么還需要HiveServer2呢?因為HiveServer不能處理多於一個客戶端的並發請求,這是由於HiveServer使用的Thrift接口所導致的限制,不能通過修改HiveServer的代碼修正。因此在Hive-0.11.0版本中重寫了HiveServer代碼得到了HiveServer2,進而解決了該問題。HiveServer2支持多客戶端的並發和認證,為開放API客戶端如JDBC、ODBC提供了更好的支持。
1、啟動服務
1)、hive-site.xml的關鍵配置
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/usr/hive/warehouse</value> //(hive中的數據庫和表在HDFS中存放的文件夾的位置)
<description>location of default database for the warehouse</description>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value> //(HiveServer2遠程連接的端口,默認為10000)
<description>Port number of HiveServer2 Thrift interface.
Can be overridden by setting $HIVE_SERVER2_THRIFT_PORT</description>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>**.**.**.**</value> //(hive所在集群的IP地址)
<description>Bind host on which to run the HiveServer2 Thrift interface. Can be overridden by setting $HIVE_SERVER2_THRIFT_BIND_HOST</description>
</property>
<property>
<name>hive.server2.long.polling.timeout</name>
<value>5000</value> // (默認為5000L,此處修改為5000,不然程序會報錯)
<description>Time in milliseconds that HiveServer2 will wait, before responding to asynchronous calls that use long polling</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value> //(Hive的元數據庫,我采用的是本地Mysql作為元數據庫)
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name> //(連接元數據的驅動名)
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name> //(連接元數據庫用戶名)
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name> // (連接元數據庫密碼)
<value>hive</value>
<description>password to use against metastore database</description>
</property>
2)、啟動元數據庫
先啟動元數據庫,在命令行中鍵入:hive --service metastore &
3)、啟動服務
#hive --service hiveserver2 >/dev/null &
以上命令啟動hiveserver2服務。
Hive提供了jdbc驅動,使得我們可以用java代碼來連接Hive並進行一些類關系型數據庫的sql語句查詢等操作。首先,我們必須將Hive的服務,也就是HiveServe打開。如果啟動hiveserver就把上面命令改為
#hive --service hiveserver >/dev/null &
2、將所需Jar包放到
$HADOOP_HOME/share/hadoop/common/hadoop-common-2.8.0.jar
$HIVE_HOME/lib/hive-exec-2.1.1.jar
$HIVE_HOME/lib/hive-jdbc-2.1.1.jar
$HIVE_HOME/lib/hive-metastore-2.1.1.jar
$HIVE_HOME/lib/hive-service-2.1.1.jar
$HIVE_HOME/lib/libfb303-0.9.3.jar
$HIVE_HOME/lib/commons-logging-1.2.jar
$HIVE_HOME/lib/slf4j-api-1.6.1.jar
3、java連接程序
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class HiveClientUtils {
private static String driverName ="org.apache.hive.jdbc.HiveDriver";
//填寫hive的IP,之前在配置文件中配置的IP
private static String Url="jdbc:hive2://localhos:10000/default";
private static Connection conn;
private static PreparedStatement ps;
private static ResultSet rs;
//創建連接
public static Connection getConnnection(){
try {
Class.forName(driverName);
//此處的用戶名一定是有權限操作HDFS的用戶,否則程序會提示"permission deny"異常
conn = DriverManager.getConnection(Url,"vagrant","vagrant");
} catch(ClassNotFoundException e) {
e.printStackTrace();
System.exit(1);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static PreparedStatement prepare(Connection conn, String sql) {
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return ps;
}
public static void getAll(String tablename) {
conn=getConnnection();
String sql="select * from "+tablename;
System.out.println(sql);
try {
ps=prepare(conn, sql);
rs=ps.executeQuery();
int columns=rs.getMetaData().getColumnCount();
while(rs.next()) {
for(int i=1;i<=columns;i++) {
System.out.print(rs.getString(i));
System.out.print("\t\t");
}
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String tablename="test1";
getAll(tablename);
}
}
上面代碼是針對hiveserver2的。如果是hiveserver。那有兩處需要修改,具體修改如下:
org.apache.Hive.jdbc.HiveDriver 改為:org.apache.Hadoop.hive.jdbc.HiveDriver
jdbc:hive2://localhost:10000/default 改為:jdbc:hive://localhost:10000/default
其中'localhost'是主機地址,10000是端口后,default是默認的db。