一 spark sql執行架構
spark sql對sql語句的處理和關係型資料庫類似,即詞法/語法解析、繫結、優化、執行。spark sql會先將sql語句解析成一棵樹,然後使用規則(rule)對tree進行繫結、優化等處理過程。spark sql由core、catalyst、hive、hive-thriftserver四部分構成:
core: 負責處理資料的輸入和輸出,如獲取資料,查詢結果輸出成dataframe等
catalyst: 負責處理整個查詢過程,包括解析、繫結、優化等
hive: 負責對hive資料進行處理
hive-thriftserver: 主要用於對hive的訪問
1.1 treenode
邏輯計畫、表示式等都可以用tree來表示,它只是在記憶體中維護,並不會進行磁碟的持久化,分析器和優化器對樹的修改只是替換已有節點。
treenode有2個直接子類,queryplan和expression。queryplam下又有logicalplan和sparkplan. expression是表示式體系,不需要執行引擎計算而是可以直接處理或者計算的節點,包括投影操作,操作符運算等
1.2 rule & ruleexecutor
rule就是指對邏輯計畫要應用的規則,以到達繫結和優化。他的實現類就是ruleexecutor。優化器和分析器都需要繼承ruleexecutor。每乙個子類中都會定義batch、once、fixpoint. 其中每乙個batch代表著一套規則,once表示對樹進行一次操作,fixpoint表示對樹進行多次的迭代操作。ruleexecutor內部提供乙個seq[batch]屬性,裡面定義的是ruleexecutor的處理邏輯,具體的處理邏輯由具體的rule子類實現。
整個流程架構圖:
二 spark sql執行原理
2.1 使用sessioncatalog儲存元資料
在解析sql語句之前,會建立sparksession,或者如果是2.0之前的版本初始化sqlcontext,sparksession只是封裝了sparkcontext和sqlcontext的建立而已。會把元資料儲存在sessioncatalog中,涉及到表名,欄位名稱和字段型別。建立臨時表或者檢視,其實就會往sessioncatalog註冊
2.2 解析sql,使用antlr生成未繫結的邏輯計畫
當呼叫sparksession的sql或者sqlcontext的sql方法,我們以2.0為準,就會使用sparksqlparser進行解析sql. 使用的antlr進行詞法解析和語法解析。它分為2個步驟來生成unresolved logicalplan:
# 詞法分析:lexical analysis,負責將token分組成符號類
# 構建乙個分析樹或者語法樹ast
2.3 使用分析器analyzer繫結邏輯計畫
在該階段,analyzer會使用analyzer rules,並結合sessioncatalog,對未繫結的邏輯計畫進行解析,生成已繫結的邏輯計畫。
2.4 使用優化器optimizer優化邏輯計畫
優化器也是會定義一套rules,利用這些rule對邏輯計畫和exepression進行迭代處理,從而使得樹的節點進行和並和優化
2.5 使用sparkplanner生成物理計畫
sparkspanner使用planning strategies,對優化後的邏輯計畫進行轉換,生成可以執行的物理計畫sparkplan.
2.6 使用queryexecution執行物理計畫
此時呼叫sparkplan的execute方法,底層其實已經再觸發job了,然後返回rdd
spark基礎之spark sql執行原理和架構
一 spark sql執行架構 spark sql對sql語句的處理和關係型資料庫類似,即詞法 語法解析 繫結 優化 執行。spark sql會先將sql語句解析成一棵樹,然後使用規則 rule 對tree進行繫結 優化等處理過程。spark sql由core catalyst hive hive ...
Storm架構執行原理
storm集群主要包含nimbus和supervisor兩部分,集群協調依賴於外部zookeeper。storm特性 1 分布式計算 2 高效能 低延時 3 可擴容 4 高度容錯 5 資料可靠 ack nimbus 集群管理中心,支援ha,負責接收客戶端提交的拓撲 topology 將任務分發給su...
SparkSQL底層執行的原理詳解 面試必備
檢視執行計畫 explain 簡介 spark sql的核心是catalyst優化器,它以一種新穎的方式利用高階程式語言功能 例如scala的模式匹配和quasiquotes 來構建可擴充套件的查詢優化器 sparksql的catalyst優化器是整個sparksql pipeline的中間核心部分...