Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動
- Hive 的hiveserver2介紹
- hiveserver2 的配置
- beeline連接配接hiveserver2
- 配置hiveserver2的界面
- spark thriftserver的配置
- beeline 連接配接spark thriftserver
- thriftserver和spark-sql對比
- spark sql 程式連接配接thriftserver
Hive 的hiveserver2介紹
HiveServer2 (HS2) 是一項使用戶端能夠針對 Hive 執行查詢的服務。 HiveServer2 是已棄用的 HiveServer1 的繼任者。 HS2 支援多用戶端并發和認證。它旨在為開放 API 用戶端(如 JDBC 和 ODBC)提供更好的支援。 HS2 是作為複合服務運作的單個程序,其中包括基于 Thrift 的 Hive 服務(TCP 或 HTTP)和用于 Web UI 的 Jetty Web 伺服器。
hiveserver2 的配置
需要在
/hive/conf/hive-site.xml
中配置
hive.server2.thrift.min.worker.threads – 最小工作線程,預設 5.
hive.server2.thrift.max.worker.threads – 最大工作線程,預設 500.
hive.server2.thrift.port – 監聽端口, 預設 10000.
hive.server2.thrift.bind.host – 綁定的位址.
比如
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- hive 的中繼資料存儲路徑,使用mysql存儲 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!-- 資料庫驅動 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<!-- 資料庫使用者名 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- 資料庫密碼 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- 是否進行版本校驗 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!-- 權限處理 -->
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
<!-- 最小工作線程,預設5 -->
<property>
<name>hive.server2.thrift.min.worker.threads</name>
<value>2</value>
</property>
<!-- 最大工作線程,預設500 -->
<property>
<name>hive.server2.thrift.max.worker.threads</name>
<value>5</value>
</property>
<!-- 綁定端口,預設10000 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<!-- 綁定位址,預設0.0.0.0 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>0.0.0.0</value>
</property>
</configuration>
因為使用了mysql資料庫存儲hive的中繼資料,是以需要從網上下載下傳mysql的驅動包
從Maven Repository: mysql » mysql-connector-java (mvnrepository.com)下載下傳就行
8.0.23版本
下載下傳位址https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.23/mysql-connector-java-8.0.23.jar
下載下傳後拷貝到
/hive/lib
目錄下

接着啟動mysql
接着啟動hdfs
啟動spark叢集
啟動spark-history
啟動hiveserver2
也可以使用
nohup ./hiveserver2 &
在背景啟動hiveserver2,将輸出寫入nohup檔案
可以使用
jps -m
檢視運作的hiveserver2程序
beeline連接配接hiveserver2
當啟動hiveserver2之後,就可以使用beeline進行連接配接了。
hiveserver2是服務端,而beeline是hive自帶的一個用戶端,除了使用beeline,還可以使用代碼連接配接hiveserver2服務端。
使用beeline連接配接需要指定連接配接url
jdbc:hive2://hadoop01:10000
比如使用如下指令連接配接
beeline -u jdbc:hive2://hadoop01:10000 -n hadoop01
其中
-u
指定連接配接url,
-n
指定用戶端的使用者名
查詢
和使用mysql非常類似
輸入
help
檢視幫助
可以看到beeline的指令都是以
!
開頭的。
配置hiveserver2的界面
可以在
/hive/conf/hive-site.xml
中配置和webUI相關的配置
<!-- hive 界面綁定位址 -->
<property>
<name>hive.server2.webui.host</name>
<value>0.0.0.0</value>
</property>
<!-- hive 界面端口 -->
<property>
<name>hive.server2.webui.port</name>
<value>8085</value>
</property>
<!-- hive 界面最大線程 -->
<property>
<name>hive.server2.webui.max.threads</name>
<value>5</value>
</property>
然後重新啟動hiveserver2
需要先殺掉原來啟動的hiveserver2,然後重新啟動
接着就能通路hive的界面了
啟動一個beeline連接配接,使用使用者名hadoop01
在啟動beeline連接配接hiveserver2的時候,可以像jdbc的連接配接url一樣,指定database
比如
beeline -u jdbc:hive2://hadoop01:10000/test_column -n hadoop01
而且在連接配接url中指定database後,連接配接了就會自動切換到指定的database上的。
檢視界面
還可以啟動更多的beeline,在同一個機器上也可以的
在同一個機器上啟動兩個beeline,使用
-n
參數區分
每個beeline上查詢,然後檢視界面
spark thriftserver的配置
使用spark-submit和spark-sql,每次執行一個sql,實際上都會産生一個spark application用于執行spark任務,如果執行的比較多的sql,就會頻繁的建立spark application,這樣就會在一定程度上耗費資源。為了實作spark application的複用,spark基本上把hive的hiveserver2照搬了過來,産生了 spark thriftserver,在使用thriftserver的時候,就能夠複用spark application。
不過生産環境中每個查詢因為資料量巨大,而且基本處于獨立的查詢操作,是以是不會使用thriftserver和hiveserver2的,這在開發中可能用的比較多。
簡單點說,spark thriftserver和hiveserver2是一樣的。
隻需要把
/hive/conf/hive-site.xml
拷貝到
/spark/conf
目錄下即可
然後啟動spark thriftserver即可
在spark的官網文檔中(spark-sql子產品下)說明spark-thriftserver的腳本
start-thriftserver.sh
接受和spark-submit一樣的參數
通過上面這句話,就基本上可以猜測出來啟動thriftserver需要哪些參數了,當然也可以通過help檢視
是以可以使用如下指令啟動thriftserver
./start-thriftserver.sh --master spark://hadoop01:4040 --jars /hive/lib/mysql-connector-java-8.0.27.jar --driver-class-path /hive/lib/mysql-connector-java-8.0.27.jar
啟動後需要手動檢視日志
啟動出現了異常,提示位址已經被使用了,說白了就是端口沖突,因為hiveserver2還是啟動,hiveserver2綁定了10000端口,而spark thriftserver啟動也需要綁定10000端口,就沖突了。
是以修改spark thriftserver的端口為10001
當然thriftserver的界面內建到了spark的界面中了,這裡的8084應該是無效的
重新啟動
啟動日志無報錯後重新整理spark叢集的界面
進入application的界面後會多出來兩個tab
通路8084界面無響應,說明在
/spark/conf/hive-site.xml
中配置的界面端口無效
beeline 連接配接spark thriftserver
使用beeline連接配接spark thriftserver和使用beeline連接配接hiveserver2完全相同
使用
beeline -u jdbc:hive2://hadoop01:10001/test_column -n sparkbeeline
連接配接
thriftserver和spark-sql對比
thriftserver和spark-sql都能直接執行sql語句,差別在于多個beeline連接配接同一個thriftserver,共用一個application,而啟動多個spark-sql就會啟動多個application
比如首先在beeline連接配接的thriftserver中執行兩次sql
重新整理spark界面,并沒有增加完成的application
停止thriftserver,因為thriftserver占用了全部叢集中的兩個核心(實際是我配置設定的核心太少了),thriftserver會自動占用每個driver的一個核心,我配置每個worker隻啟動一個driver,每個driver隻有一個核心,是以thriftserver就占用了全部的核心。
接着啟動spar-sql,占用一個核心
使用
spark-sql --num-executors 1 --master spark://hadoop01:4040 --jars /hive/lib/mysql-connector-java-8.0.27.jar --driver-class-path /hive/lib/mysql-connector-java-8.0.27.jar
啟動spark-sql,要求隻占用一個executor
可惜的是,即使指定了
--num-executors
也沒有生效,spark-sql又占用了全部核心
接着執行一個sql
執行發現,好像和預期的不一樣,也是所有的sql使用同一個application
在啟動一個spark-sql
此時檢視spark界面,發現是兩個application
證明了每個spark-sql執行個體對應一個application(沒有配置設定到資源請忽略)
接着啟動thriftserver
接着啟動一個beeline
啟動了兩個beeline,連接配接同一個thriftserver,但是卻隻有一個application
這就是spark-sql與thriftserver最大的差別
spark sql 程式連接配接thriftserver
使用spark-submit和spark-sql,每次執行一個sql,實際上都會産生一個spark application用于執行spark任務,如果執行的比較多的sql,就會頻繁的建立spark application,這樣就會在一定程度上耗費資源。為了實作spark application的複用,spark基本上把hive的hiveserver2照搬了過來,産生了 spark thriftserver,在使用thriftserver的時候,就能夠複用spark application。
不過生産環境中每個查詢因為資料量巨大,而且基本處于獨立的查詢操作,是以是不會使用thriftserver和hiveserver2的,這在開發中可能用的比較多。
要使用thriftserver就需要在依賴中加入hive-jdbc的依賴(前面說了,spark的thriftserver就是照搬hiveserver2的)
Maven Repository: org.apache.hive » hive-jdbc » 3.1.2 (mvnrepository.com)
直接增加會因為無法下載下傳
jdk-tools:jdk-toos.jar:1.6
報錯,無法下載下傳
在實際測試中,這個确實比較惡心,網上有一種解決方案是自己下載下傳依賴,然後使用maven本地安裝,然後在加載依賴,經過測試,沒用。
我自己的解決方案是不管他,報紅就使用排除
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>${hive.jdbc.version}</version>
<exclusions>
<exclusion>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
</exclusion>
</exclusions>
</dependency>
然後在根目錄下使用maven指令下載下傳依賴
mvn dependency:sources
下載下傳源碼和依賴,然後重新加載maven項目,此時會把除了jdk.tools之外的依賴加入到項目中
接着就可以開始編碼了
import java.sql.DriverManager
object SparkThriftServerApp {
def main(args: Array[String]): Unit = {
// 1. 加載驅動
Class.forName("org.apache.hive.jdbc.HiveDriver")
// 2. 擷取連接配接,使用者名密碼如果沒有随便寫,這裡和beeline連接配接thriftserver是一樣的
val coon = DriverManager getConnection("jdbc:hive2://hadoop01:10000/test_column", "root", "")
// 3. 編寫查詢sql
val pstmt = coon prepareStatement "select * from columns limit 10"
// 4. 查詢
val rs = pstmt executeQuery()
// 5. 擷取傳回結果的中繼資料資訊 --- 表頭
val metaData = rs getMetaData()
// 6. 使用可變清單存儲表頭
var columsArray = List[String]()
// 7. 循環列印表頭,切記從 1 開始,不是從 0 開始
for(i <- Range(1, metaData getColumnCount) inclusive) {
columsArray = columsArray :+ (metaData getColumnName i)
print(s"${metaData getColumnName i}\t")
}
println
// 8. 循環讀取資料,也是從 1 開始,不是從 0 開始
while (rs next()) {
for (i <- Range(1, columsArray length) inclusive) {
print(s"${rs getString(i)}\t")
}
println
}
// 9. 關閉連接配接
rs close()
pstmt close()
coon close()
}
}
執行結果如下
也可以在thriftserver的監控界面檢視執行的sql