1. 程式人生 > >java本地使用JDBC連線Spark SQL(HiveServer2)

java本地使用JDBC連線Spark SQL(HiveServer2)

根據Spark官網所述,Spark SQL實現了Thrift JDBC/ODBC server:

The Thrift JDBC/ODBC server implemented here corresponds to the HiveServer2 in Hive 1.2.1 You can test the JDBC server with the beeline script that comes with either Spark or Hive 1.2.1.

這就意味著我們可以像HIVE那樣通過JDBC遠端連線Spark SQL傳送SQL語句並執行。

1、準備工作

在這之前需要先將${HIVE_HOME}/conf/hive-site.xml 拷貝到${SPARK_HOME}/conf目錄下,由於我的hive配置了元資料資訊存

儲在MySQL中,所以Spark在訪問這些元資料資訊時需要mysql連線驅動的支援。新增驅動的方式有三種:


第一種是在${SPARK_HOME}/conf目錄下的spark-defaults.conf中新增:spark.jars /opt/lib/mysql-connector-java-5.1.26-bin.jar 


第二種是通過 新增 :spark.driver.extraClassPath /opt/lib2/mysql-connector-java-5.1.26-bin.jar  這種方式也可以實現新增多個依賴jar,比較方便


第三種是在執行時 新增 --jars /opt/lib2/mysql-connector-java-5.1.26-bin.jar


做完上面的準備工作後,spark sql和Hive就繼承在一起了,spark sql可以讀取hive中的資料

2、啟動thrift

在spark根目錄下執行:./sbin/start-thriftserver.sh 開啟thrift伺服器

start-thriftserver.sh 和spark-submit的用法類似,可以接受所有spark-submit的引數,並且還可以接受--hiveconf 引數。

不新增任何引數表示以local方式執行。

預設的監聽埠為10000

3、用beeline測試

在spark根目錄下執行:

./bin/beeline

連線 JDBC/ODBC server

beeline> !connect jdbc:hive2://localhost:10000

連線後會提示輸入使用者名稱和密碼,使用者名稱可以填當前登陸的linux使用者名稱,密碼為空即可,連線成功如下圖所示:

執行show tables;

可以看到之前我在hive中使用的三張表

看一下doc1的表結構:

執行查詢操作:

4、在java程式碼中用jdbc連線

接下來開啟eclipse用jdbc連線hiveserver2,連線hive的步驟同樣如此。
新建一個maven專案:
在pom.xml新增以下依賴:

(注意!!hive-jdbc的版本一定要和伺服器上的hive版本對應,jdk版本和本地機器的對應 這邊以1.8為例,不然會報錯!!!)

(注意!!hive沒有提供-version的版本檢視命令,檢視hive版本請移步:

http://blog.csdn.net/zyzzxycj/article/details/79268754)

<dependencies>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>1.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.4.1</version>
        </dependency>

        <dependency>
            <groupId>jdk.tools</groupId>
            <artifactId>jdk.tools</artifactId>
            <version>1.8</version>
        </dependency>
    </dependencies>


然後將jdk中的${JAVA_HOME}/lib/tools.jar拷貝到當前工程目錄下,在執行以下程式碼 手動安裝:

(注意!!-Dversion=1.* 這邊的版本對應)

mvn install:install-file -DgroupId=jdk.tools -DartifactId=jdk.tools -Dpackaging=jar -Dversion=1.8 -Dfile=tools.jar -DgeneratePom=true


等待maven載入完成後,進入下一步:

在編寫jdbc連線程式碼之前要了解連線hiveserver2的相關引數:

驅動:org.apache.hive.jdbc.HiveDriver

url:jdbc:hive2://你的hive地址:埠號/資料庫名

使用者名稱:root (啟動thriftserver的linux使用者名稱)

密碼:“”(預設密碼為空)

import java.sql.*;

public class test_Spark_JDBC {
    public static void main(String[] args) throws SQLException {
        String url = "jdbc:hive2://你的hive地址:埠號/資料庫名";
        try {
            Class.forName("org.apache.hive.jdbc.HiveDriver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Connection conn = DriverManager.getConnection(url, "root", "");
        Statement stmt = conn.createStatement();
        String sql = "SELECT name,price FROM instancedetail_test limit 10";
        String sql2 = "desc instancedetail_test";
        String sql3 = "SELECT count(*) FROM instancedetail_test";
        ResultSet res = stmt.executeQuery(sql);
        while (res.next()) {
            System.out.println(res.getString(1) + "\t" + res.getDouble(2));
    }
        res = stmt.executeQuery(sql2);
        res = stmt.executeQuery(sql3);
//        while (res.next()) {
//            System.out.println("id: " + res.getInt(1) + "\ttype: " + res.getString(2) + "\tauthors: " + res.getString(3) + "\ttitle: " + res.getString(4) + "\tyear:" + res.getInt(5));
//        }
    }
}

至此 連線成功! 有錯誤或疑問歡迎評論~