Spark SQL的Thrift JDBC/ODBC server是基于Hive 0.13的HiveServer2實(shí)現(xiàn)的圣蝎。這個(gè)服務(wù)啟動(dòng)之后刃宵,最主要的功能就是可以讓我們通過(guò)Java JDBC來(lái)以編程的方式調(diào)用Spark SQL。此外徘公,在啟動(dòng)該服務(wù)之后牲证,可以通過(guò)Spark或Hive 0.13自帶的beeline工具來(lái)進(jìn)行測(cè)試。
要啟動(dòng)JDBC/ODBC server关面,主要執(zhí)行Spark的sbin目錄下的start-thriftserver.sh命令即可
start-thriftserver.sh命令可以接收所有spark-submit命令可以接收的參數(shù)坦袍,額外增加的一個(gè)參數(shù)是--hiveconf,可以用于指定一些Hive的配置屬性等太∥嫫耄可以通過(guò)執(zhí)行./sbin/start-thriftserver.sh --help來(lái)查看所有可用參數(shù)的列表。默認(rèn)情況下缩抡,啟動(dòng)的服務(wù)會(huì)在localhost:10000地址上監(jiān)聽(tīng)請(qǐng)求奠宜。
可以使用兩種方式來(lái)改變服務(wù)監(jiān)聽(tīng)的地址
第一種:指定環(huán)境變量
export HIVE_SERVER2_THRIFT_PORT=<listening-port>
export HIVE_SERVER2_THRIFT_BIND_HOST=<listening-host>
./sbin/start-thriftserver.sh \
--master <master-uri> \
...
第二種:使用命令的參數(shù)
./sbin/start-thriftserver.sh \
--hiveconf hive.server2.thrift.port=<listening-port> \
--hiveconf hive.server2.thrift.bind.host=<listening-host> \
--master <master-uri>
...
這兩種方式的區(qū)別就在于,第一種是針對(duì)整個(gè)機(jī)器上每次啟動(dòng)服務(wù)都生效的; 第二種僅僅針對(duì)本次啟動(dòng)生效
本案例使用第一種,啟動(dòng)腳本為
./start-thriftserver.sh \
--master spark://spark-project-1:7077 \
--jars /opt/module/hive/lib/mysql-connector-java-5.1.17.jar
接著就可以通過(guò)Spark或Hive的beeline工具來(lái)測(cè)試Thrift JDBC/ODBC server
在Spark的bin目錄中压真,執(zhí)行beeline命令(當(dāng)然娩嚼,我們也可以使用Hive自帶的beeline工具):./bin/beeline
進(jìn)入beeline命令行之后,連接到JDBC/ODBC server上去:beeline> !connect jdbc:hive2://localhost:10000
beeline通常會(huì)要求你輸入一個(gè)用戶名和密碼滴肿。在非安全模式下岳悟,我們只要輸入本機(jī)的用戶名(比如root),以及一個(gè)空的密碼即可泼差。
對(duì)于安全模式竿音,需要根據(jù)beeline的文檔來(lái)進(jìn)行認(rèn)證。
除此之外拴驮,要注意的是春瞬,如果我們想要直接通過(guò)JDBC/ODBC服務(wù)訪問(wèn)Spark SQL,并直接對(duì)Hive執(zhí)行SQL語(yǔ)句套啤,那么就需要將Hive,的hive-site.xml配置文件放在Spark的conf目錄下宽气。
Thrift JDBC/ODBC server也支持通過(guò)HTTP傳輸協(xié)議發(fā)送thrift RPC消息。使用以下方式的配置可以啟動(dòng)HTTP模式:
命令參數(shù)
./sbin/start-thriftserver.sh \
--hive.server2.transport.mode=http \
--hive.server2.thrift.http.port=10001 \
--hive.server2.http.endpoint=cliservice \
--master <master-uri>
...
./sbin/start-thriftserver.sh \
--master spark://spark-project-1:7077 \
--jars /opt/module/hive/lib/mysql-connector-java-5.1.17.jar \
--hiveconf hive.server2.transport.mode=http \
--hiveconf hive.server2.thrift.http.port=10001 \
--hiveconf hive.server2.http.endpoint=cliservice
beeline連接服務(wù)時(shí)指定參數(shù)
beeline> !connect jdbc:hive2://localhost:10001/default?hive.server2.transport.mode=http;hive.server2.thrift.http.path=cliservice
最重要的潜沦,當(dāng)然是通過(guò)Java JDBC的方式萄涯,來(lái)訪問(wèn)Thrift JDBC/ODBC server,調(diào)用Spark SQL唆鸡,并直接查詢Hive中的數(shù)據(jù),通過(guò)Java JDBC的方式涝影,必須通過(guò)HTTP傳輸協(xié)議發(fā)送thrift RPC消息,Thrift JDBC/ODBC server必須通過(guò)上面命令啟動(dòng)HTTP模式
添加maven依賴
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>0.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.1</version>
</dependency>
代碼
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class ThriftJDBCServerTest {
public static void main(String[] args) {
String sql = "select key from src where key=?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Class.forName("org.apache.hive.jdbc.HiveDriver");
conn = DriverManager.getConnection("jdbc:hive2://192.168.114.200:10001/default?hive.server2.transport.mode=http;hive.server2.thrift.http.path=cliservice",
"root",
"");
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 480);
rs = pstmt.executeQuery();
while(rs.next()) {
String name = rs.getString(1);
System.out.println(name);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}