天天看點

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

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​

​目錄下

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

接着啟動mysql

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

接着啟動hdfs

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

啟動spark叢集

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

啟動spark-history

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

啟動hiveserver2

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

也可以使用​

​nohup ./hiveserver2 &​

​ 在背景啟動hiveserver2,将輸出寫入nohup檔案

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

可以使用​

​jps -m​

​檢視運作的hiveserver2程序

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

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​

​指定用戶端的使用者名

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

查詢

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

和使用mysql非常類似

輸入​

​help​

​檢視幫助

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

可以看到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的hiveserver2和beeline的使用以及spark thritfserver的啟動

接着就能通路hive的界面了

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

啟動一個beeline連接配接,使用使用者名hadoop01

在啟動beeline連接配接hiveserver2的時候,可以像jdbc的連接配接url一樣,指定database

比如​

​beeline -u jdbc:hive2://hadoop01:10000/test_column -n hadoop01​

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

而且在連接配接url中指定database後,連接配接了就會自動切換到指定的database上的。

檢視界面

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

還可以啟動更多的beeline,在同一個機器上也可以的

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

在同一個機器上啟動兩個beeline,使用​

​-n​

​參數區分

每個beeline上查詢,然後檢視界面

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

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​

​目錄下即可

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

然後啟動spark thriftserver即可

在spark的官網文檔中(spark-sql子產品下)說明spark-thriftserver的腳本​

​start-thriftserver.sh​

​接受和spark-submit一樣的參數

通過上面這句話,就基本上可以猜測出來啟動thriftserver需要哪些參數了,當然也可以通過help檢視

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

是以可以使用如下指令啟動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​

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

啟動後需要手動檢視日志

啟動出現了異常,提示位址已經被使用了,說白了就是端口沖突,因為hiveserver2還是啟動,hiveserver2綁定了10000端口,而spark thriftserver啟動也需要綁定10000端口,就沖突了。

是以修改spark thriftserver的端口為10001

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

當然thriftserver的界面內建到了spark的界面中了,這裡的8084應該是無效的

重新啟動

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

啟動日志無報錯後重新整理spark叢集的界面

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

進入application的界面後會多出來兩個tab

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

通路8084界面無響應,說明在​

​/spark/conf/hive-site.xml​

​中配置的界面端口無效

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

beeline 連接配接spark thriftserver

使用beeline連接配接spark thriftserver和使用beeline連接配接hiveserver2完全相同

使用​

​beeline -u jdbc:hive2://hadoop01:10001/test_column -n sparkbeeline​

​連接配接

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

thriftserver和spark-sql對比

thriftserver和spark-sql都能直接執行sql語句,差別在于多個beeline連接配接同一個thriftserver,共用一個application,而啟動多個spark-sql就會啟動多個application

比如首先在beeline連接配接的thriftserver中執行兩次sql

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

重新整理spark界面,并沒有增加完成的application

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

停止thriftserver,因為thriftserver占用了全部叢集中的兩個核心(實際是我配置設定的核心太少了),thriftserver會自動占用每個driver的一個核心,我配置每個worker隻啟動一個driver,每個driver隻有一個核心,是以thriftserver就占用了全部的核心。

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

接着啟動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

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

可惜的是,即使指定了​

​--num-executors​

​也沒有生效,spark-sql又占用了全部核心

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

接着執行一個sql

執行發現,好像和預期的不一樣,也是所有的sql使用同一個application

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動
Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

在啟動一個spark-sql

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

此時檢視spark界面,發現是兩個application

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

證明了每個spark-sql執行個體對應一個application(沒有配置設定到資源請忽略)

接着啟動thriftserver

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

接着啟動一個beeline

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

啟動了兩個beeline,連接配接同一個thriftserver,但是卻隻有一個application

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

這就是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之外的依賴加入到項目中

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

接着就可以開始編碼了

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()
  }

}      

執行結果如下

Hive的hiveserver2和beeline的使用以及spark thritfserver的啟動

也可以在thriftserver的監控界面檢視執行的sql

繼續閱讀