在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語句並執行。

準備

在這之前需要先將${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中的數據

啓動thrift

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

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

不添加任何參數表示以local方式運行。

默認的監聽端口爲10000

用beeline測試

在spark根目錄下執行:
./bin/beeline
連接 JDBC/ODBC server
beeline> !connect jdbc:hive2://localhost:10000
連接後會提示輸入用戶名和密碼,用戶名可以填當前登陸的linux用戶名,密碼爲空即可,連接成功如下圖所示:

執行show tables;

可以看到之前我在hive中使用的三張表
看一下doc1的表結構:

執行查詢看看:


在java代碼中用jdbc連接

接下來打開eclipse用jdbc連接hiveserver2,連接hive的步驟同樣如此。
新建一個maven項目:
在pom.xml添加以下依賴:
  	<dependency>
	        <groupId>org.apache.hive</groupId>
	        <artifactId>hive-jdbc</artifactId>
	        <version>1.2.1</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.6</version>
        <scope>system</scope>
        <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
    </dependency>
在編寫jdbc連接代碼之前要了解連接hiveserver2的相關參數:
驅動:org.apache.hive.jdbc.HiveDriver
url:jdbc:hive2://192.168.1.131:10000/default
用戶名:hadoop (啓動thriftserver的linux用戶名)
密碼:“”(默認密碼爲空)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Test1 {

	public static void main(String[] args) throws SQLException {
		String url = "jdbc:hive2://192.168.1.131:10000/default";
		try {
			Class.forName("org.apache.hive.jdbc.HiveDriver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Connection conn = DriverManager.getConnection(url,"hadoop","");
		Statement stmt = conn.createStatement();
		String sql = "SELECT * FROM doc1 limit 10";
		System.out.println("Running"+sql);
		ResultSet res = stmt.executeQuery(sql);
		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));
		}
	}

}

打印輸出:
可以看到連接成功,結果正常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章