根據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測試
在java代碼中用jdbc連接
<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的相關參數: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));
}
}
}
打印輸出: