SparkSql運行原理詳細解析


  傳統關系型數據庫中 ,最基本的sql查詢語句由projecttion (field a,field b,field c) , datasource (table A) 和 fieter (field a >10) 三部分組成。 分別對應了sql查詢過程中的result , datasource和operation ,也就是按照result ——> datasource ——> operation 的順序來描述,如下圖所示:

  但是sql實際執行過程是按照operation——> datasource——>result 的順序來執行的這與sql語法正好相反,具體的執行過程如下:

  1 . 語法和詞法解析:對寫入的sql語句進行詞法和語法解析(parse),分辨出sql語句在哪些是關鍵詞(如select ,from 和where),哪些是表達式,哪些是projection ,哪些是datasource等,判斷SQL語法是否規范,並形成邏輯計划。

  2 .綁定:將SQL語句和數據庫的數據字典(列,表,視圖等)進行綁定(bind),如果相關的projection和datasource等都在的話,則表示這個SQL語句是可以執行的。

  3 .優化(optimize):一般的數據庫會提供幾個執行計划,這些計划一般都有運行統計數據,數據庫會在這些計划中選擇一個最優計划。

  4 .執行(execute):執行前面的步驟獲取最有執行計划,返回查詢的數據集。

  SparkSQL的運行架構:

  Spark SQL對SQL語句的處理和關系型數據庫采用了類似的方法,sparksql先會將SQL語句進行解析(parse)形成一個Tree,然后使用Rule對Tree進行綁定,優化等處理過程,通過模式匹配對不同類型的節點采用不同操作。而sparksql的查詢優化器是catalyst,它負責處理查詢語句的解析,綁定,優化和生成物理執行計划等過程,catalyst是sparksql最核心部分。

  Spark SQL由core,catalyst,hive和hive-thriftserver4個部分組成。

  •   core: 負責處理數據的輸入/輸出,從不同的數據源獲取數據(如RDD,Parquet文件和JSON文件等),然后將結果查詢結果輸出成Data Frame。
  •        catalyst: 負責處理查詢語句的整個處理過程,包括解析,綁定,優化,生成物理計划等。
  •        hive: 負責對hive數據的處理。
  •        hive-thriftserver:提供client和JDBC/ODBC等接口。

  運行原理原理分析: 

  1.使用SesstionCatalog保存元數據

  在解析sql語句前需要初始化sqlcontext,它定義sparksql上下文,在輸入sql語句前會加載SesstionCatalog,初始化sqlcontext時會把元數據保存在SesstionCatalog中,包括庫名,表名,字段,字段類型等。這些數據將在解析未綁定的邏輯計划上使用。

  2.使用Antlr生成未綁定的邏輯計划

  Spark2.0版本起使用Antlr進行詞法和語法解析,Antlr會構建一個按照關鍵字生成的語法樹,也就是生成的未綁定的邏輯計划。

  3.使用Analyzer綁定邏輯計划

  在這個階段Analyzer 使用Analysis Rules,結合SessionCatalog元數據,對未綁定的邏輯計划進行解析,生成已綁定的邏輯計划。

  4.使用Optimizer優化邏輯計划

  Opetimize(優化器)的實現和處理方式同Analyzer類似,在該類中定義一系列Rule,利用這些Rule對邏輯計划和Expression進行迭代處理,達到樹的節點的合並和優化。

  5.使用SparkPlanner生成可執行計划的物理計划

   SparkPlanner使用Planning Strategies對優化的邏輯計划進行轉化,生成可執行的物理計划。

  6.使用QueryExecution執行物理計划

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM