一點資訊SparkSQL查詢引擎實踐

  “本文分析SparkSQL ThriftServer工作原理,修改Spark SQL源代碼並實現了SQL 查詢進度的計算,最後展示了一點資訊基於Presto+SparkSQL+Hive的Web查詢引擎”

  01

  —

  問題背景:SparkSQL ThriftServer 無法獲取查詢進度

  目前公司的分佈式Adhoc查詢有以下幾種:Presto,Hive,SparkSQL。公司外部開源系統裏比較知名的有Redash,Zeppelin等查詢工具。

  以上查詢工具均支持:Hive、SparkSQL、Mysql等查詢數據源,SQL格式化,結果進行排序等。Redash還支持語法動態提示等功能,非常的方便。

  然而很遺憾的是: 上述開源工具,無論是對接SparkSQL還是對接HiveServer2都有一個致命的問題就是——無法知曉查詢的進度,甚至是像Presto這種本身帶有進度的查詢引擎,在接入Redash等系統後,也無法知曉當前查詢的時間、進度、剩餘時間等。

  查詢進度重要嗎?

  從人機交互的角度看,快查詢進度條意義不大,但是Hive等MR查詢長時間的盲目等待是難以接受的(Hive命令行提供大致的MR進度展示)。如MysqlWorkBench和Navicat Mysql等工具

  Mysql查詢大都是毫秒級別返回,不顯示進度條。

  導入導出數據庫時以上工具都有進度條,即長時間作業需要進度條。

  我們的目標是:深入分析SparkSQL ThriftServer的工作過程,並通過修改源代碼等方式來獲取執行的狀態,讓Presto查詢、Hive查詢、SparkSQL查詢均能感知到進度。本文重點介紹了SparkSQL查詢進度的實現。

  02

  —

  SparkSQL ThriftServer工作原理剖析

  圖1: SparkSQL ThriftServer工作的5個步驟

  從上圖可知,SparkSQL ThriftServer的啓動過程分5個步驟。在步驟3 ExecuteStatement時,SparkSQL 爲每一個查詢創建Spark的Job,並隨機生成UUID。

  一點大數據團隊修改SparkSQL源代碼實現定製化的JobID生成,並跟蹤每個SparkJob的運行過程實現SQL執行進度的計算。

  1:SparkSQL初始化

  圖2: SparkSQL ThriftServer 初始化

  如上圖所知,SparkSQL ThriftServer初始化包含以下幾個步驟:

  Java Main函數啓動,初始化HiveServer2,創建 ThriftBinaryCLIService

  創建Hive模塊內的 ThriftBinaryCLIService 並傳入 SparkSQL模塊內的SparkSqlCliService

  創建SparkSQLSessionManager 通過反射方式將CliService中的SessionManager設置爲自身

  使用反射是因爲Hive代碼中的CLiService的SessonManager爲Private方法

  Thrift BinaryService啓動,並根據配置的ThriftSever端口、地址等信息創建TThreadPoolServer。

  2:建立鏈接OpenSession:

  客戶端(Beeline CLI) 向服務器ThriftBinaryServer發送OpenSession的Thrift請求:

  SparkSQLCLIService 調用初始化過程中創建的SessionManager 創建Session

  此時根據配置的不同爲Thrift的會話綁定一個SparkSession

  每個Session設置自己的SessionManager和OperationManager

  SessonManager用於管理整個Hive的查詢週期,比如建立鏈接、關閉鏈接等。

  OperationManager 完成具體任務:用於執行具體的任務邏輯比如查看錶信息、查看元數據

  SparkSQL重寫OperationManager的newExecuteStatementOperation()方法, 轉換爲Spark作業
  

  

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