Hive:用Java代碼經過JDBC鏈接Hiveserver

參考https://www.iteblog.com/archives/846.htmlhtml

一、hive依賴hadoop,將hdfs看成文件存儲介質,那是否意味着hive須要知道namenode的地址?java

     實際上在hive的hive-env.sh 中配置了 HADOOP_HOME=/home/install/hadoop-2.5.1node

二、hive的本地模式和遠程模式有什麼區別?mysql

     hive本質上是將sql語法解析爲mapreduce的過程,既然如此它就必須提交mapreduce任務到resoucemanager,那麼它如何提交?就是經過hadoop提供的命令hadoop jar命令來提交。linux

     本地模式:簡單的理解,hive客戶端僅供本地使用,直接使用hive命令,不須要指定IP 端口
web

     遠程模式:簡單的理解,將hive發佈成一個服務進程,經過hive --service hiveserver命令,那麼其餘hive客戶端就能夠鏈接hive的服務進程sql

                其餘客戶端能夠是jdbc方式、hive提供的beeline命令等,既然要鏈接遠端的hive服務進程,那天然須要指定 IP 端口,這裏的IP指的是hive服務進程所在的IP,端口天然也是,也天然與hadoop無關。因此不要混淆
數據庫

HiveServer2提供了一個新的命令行工具Beeline,它是基於SQLLine CLI的JDBC客戶端。apache

Beeline工做模式有兩種,即本地嵌入模式和遠程模式。嵌入模式狀況下,它返回一個嵌入式Hive(相似於Hive CLI)。而遠程模式則是經過Thrift協議與某個單獨的HiveServer2進程進行鏈接通訊。瀏覽器

hive的三種鏈接方式

一、hive 命令行模式,直接輸入/hive/bin/hive的執行程序,或者輸入 hive --service cli
用於linux平臺命令行查詢,查詢語句基本跟mysql查詢語句相似
二、 hive web界面的 (端口號9999) 啓動方式
hive –service hwi &
       用於經過瀏覽器來訪問hive,感受沒多大用途
三、 hive 遠程服務 (端口號10000) 啓動方式
hive --service hiveserver &
或者
hive --service hiveserver 10000>/dev/null 2>/dev/null &
    beeline方式鏈接:beeline -u jdbc:hive2//localhost:10000/default -n root -p 123456
    或者
    java client方式鏈接
備註:
鏈接Hive JDBC URL:jdbc:hive://192.168.6.116:10000/default (Hive默認端口:10000 默認數據庫名:default)

第一步:開啓hive 遠程服務

bin/hive --service hiveserver -p 10002
   Starting Hive Thrift Server
第二步:添加依賴
 <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.7.1</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.7.1</version>
    </dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>1.2.1</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-metastore -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-metastore</artifactId>
        <version>1.2.1</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-metastore -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>1.2.1</version>
    </dependency>
   
 
第三步:
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
 
public class HiveJdbcTest {
     
    private static String driverName =
                   "org.apache.hadoop.hive.jdbc.HiveDriver";
   
    public static void main(String[] args)
                            throws SQLException {
        try {
            Class.forName(driverName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.exit(1);
        }
 
        Connection con = DriverManager.getConnection(
                           "jdbc:hive2://localhost:10002/default", "wyp", "");
        Statement stmt = con.createStatement();
        String tableName = "wyphao";
        stmt.execute("drop table if exists " + tableName);
        stmt.execute("create table " + tableName +
                                     " (key int, value string)");
        System.out.println("Create table success!");
        // 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));
        }
 
 
        sql = "select * from " + tableName;
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(String.valueOf(res.getInt(1)) + "\t"
                                               + res.getString(2));
        }
 
        sql = "select count(1) from " + tableName;
        System.out.println("Running: " + sql);
        res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1));
        }
    }
}
相關文章
相關標籤/搜索