Spark SQL:4.對Spark SQL的理解
Catalyst
Catalyst是與Spark解耦的一個獨立庫,是一個impl-free的執行計劃的生成和優化框架。
目前與Spark Core還是耦合的,對此user郵件組裡有人對此提出疑問,見mail。
以下是Catalyst較早時候的架構圖,展示的是程式碼結構和處理流程。
Catalyst定位
其他系統如果想基於Spark做一些類sql、標準sql甚至其他查詢語言的查詢,需要基於Catalyst提供的解析器、執行計劃樹結構、邏輯執行計劃的處理規則體系等類體系來實現執行計劃的解析、生成、優化、對映工作。
對應上圖中,主要是左側的TreeNodelib及中間三次轉化過程中涉及到的類結構都是Catalyst提供的。至於右側物理執行計劃對映生成過程,物理執行計劃基於成本的優化模型,具體物理運算元的執行都由系統自己實現。
Catalyst現狀
在解析器方面提供的是一個簡單的scala寫的sql parser,支援語義有限,而且應該是標準sql的。
在規則方面,提供的優化規則是比較基礎的(和Pig/Hive比沒有那麼豐富),不過一些優化規則其實是要涉及到具體物理運算元的,所以部分規則需要在系統方那自己制定和實現(如spark-sql裡的SparkStrategy)。
Catalyst也有自己的一套資料型別。
TreeNode體系
TreeNode是Catalyst執行計劃表示的資料結構,是一個樹結構,具備一些scala collection的操作能力和樹遍歷能力。這棵樹一直在記憶體裡維護,不會dump到磁碟以某種格式的檔案存在,且無論在對映邏輯執行計劃階段還是優化邏輯執行計劃階段,樹的修改是以替換已有節點的方式進行的。
TreeNode,內部帶一個children: Seq[BaseType]表示孩子節點,具備foreach、map、collect等針對節點操作的方法,以及transformDown(預設,前序遍歷)、transformUp這樣的遍歷樹上節點,對匹配節點實施變化的方法。
提供UnaryNode,BinaryNode, LeafNode三種trait,即非葉子節點允許有一個或兩個子節點。
TreeNode提供的是範型。
TreeNode有兩個子類繼承體系,QueryPlan和Expression。QueryPlan下面是邏輯和物理執行計劃兩個體系,前者在Catalyst裡有詳細實現,後者需要在系統自己實現。Expression是表示式體系,後面章節都會展開介紹。
Tree的transformation實現:
傳入PartialFunction[TreeType,TreeType],如果與操作符匹配,則節點會被結果替換掉,否則節點不會變動。整個過程是對children遞迴執行的。
執行計劃表示模型
邏輯執行計劃
QueryPlan繼承自TreeNode,內部帶一個output: Seq[Attribute],具備transformExpressionDown、transformExpressionUp方法。
在Catalyst中,QueryPlan的主要子類體系是LogicalPlan,即邏輯執行計劃表示。其物理執行計劃表示由使用方實現(spark-sql專案中)。
LogicalPlan繼承自QueryPlan,內部帶一個reference:Set[Attribute],主要方法為resolve(name:String): Option[NamedeExpression],用於分析生成對應的NamedExpression。
LogicalPlan有許多具體子類,也分為UnaryNode, BinaryNode, LeafNode三類,具體在org.apache.spark.sql.catalyst.plans.logical路徑下。
邏輯執行計劃實現
LeafNode主要子類是Command體系:
各command的語義可以從子類名字看出,代表的是系統可以執行的non-query命令,如DDL。
UnaryNode的子類:
BinaryNode的子類:
物理執行計劃
另一方面,物理執行計劃節點在具體系統裡實現,比如spark-sql工程裡的SparkPlan繼承體系。
物理執行計劃實現
每個子類都要實現execute()方法,大致有以下實現子類(不全)。
LeafNode的子類:
UnaryNode的子類:
BinaryNode的子類:
提到物理執行計劃,還要提一下Catalyst提供的分割槽表示模型。
執行計劃對映
Catalyst還提供了一個QueryPlanner[Physical <: TreeNode[PhysicalPlan]]抽象類,需要子類制定一批strategies: Seq[Strategy],其apply方法也是類似根據制定的具體策略來把邏輯執行計劃運算元對映成物理執行計劃運算元。由於物理執行計劃的節點是在具體系統裡實現的,所以QueryPlanner及裡面的strategies也需要在具體系統裡實現。
在spark-sql專案中,SparkStrategies繼承了QueryPlanner[SparkPlan],內部制定了LeftSemiJoin, HashJoin,PartialAggregation, BroadcastNestedLoopJoin, CartesianProduct等幾種策略,每種策略接受的都是一個LogicalPlan,生成的是Seq[SparkPlan],每個SparkPlan理解為具體RDD的運算元操作。
比如在BasicOperators這個Strategy裡,以match-case匹配的方式處理了很多基本運算元(可以一對一直接對映成RDD運算元),如下:
case logical.Project(projectList, child) =>
execution.Project(projectList, planLater(child)) :: Nil
case logical.Filter(condition, child) =>
execution.Filter(condition, planLater(child)) :: Nil
case logical.Aggregate(group, agg, child) =>
execution.Aggregate(partial = false, group, agg, planLater(child))(sqlContext) :: Nil
case logical.Sample(fraction, withReplacement, seed, child) =>
execution.Sample(fraction, withReplacement, seed, planLater(child)) :: Nil
Expression體系
Expression,即表示式,指不需要執行引擎計算,而可以直接計算或處理的節點,包括Cast操作,Projection操作,四則運算,邏輯操作符運算等。
具體可以參考org.apache.spark.sql.expressionspackage下的類。
Rules體系
凡是需要處理執行計劃樹(Analyze過程,Optimize過程,SparkStrategy過程),實施規則匹配和節點處理的,都需要繼承RuleExecutor[TreeType]抽象類。
RuleExecutor內部提供了一個Seq[Batch],裡面定義的是該RuleExecutor的處理步驟。每個Batch代表著一套規則,配備一個策略,該策略說明了迭代次數(一次還是多次)。
protected case class Batch(name: String, strategy: Strategy, rules: Rule[TreeType]*)
Rule[TreeType <: TreeNode[_]]是一個抽象類,子類需要複寫apply(plan: TreeType)方法來制定處理邏輯。
RuleExecutor的apply(plan: TreeType): TreeType方法會按照batches順序和batch內的Rules順序,對傳入的plan裡的節點迭代處理,處理邏輯為由具體Rule子類實現。
https://blog.csdn.net/pelick/article/details/37809681?utm_source=tuicool
相關文章
- Spark系列 - (3) Spark SQLSparkSQL
- Spark SQL 教程: 通過示例瞭解 Spark SQLSparkSQL
- Spark SQL 教程: 透過示例瞭解 Spark SQLSparkSQL
- spark學習筆記--Spark SQLSpark筆記SQL
- Spark SQL | Spark,從入門到精通SparkSQL
- spark2.2.0 配置spark sql 操作hiveSparkSQLHive
- Spark 系列(九)—— Spark SQL 之 Structured APISparkSQLStructAPI
- Cris 的 Spark SQL 筆記SparkSQL筆記
- Spark API 全集(1):Spark SQL Dataset & DataFrame APISparkAPISQL
- Spark 系列(十一)—— Spark SQL 聚合函式 AggregationsSparkSQL函式
- Spark Streaming + Spark SQL 實現配置化ETSparkSQL
- spark sql 實踐(續)SparkSQL
- Hive on Spark和Spark sql on Hive,你能分的清楚麼HiveSparkSQL
- Hive on Spark 和 Spark sql on Hive,你能分的清楚麼HiveSparkSQL
- Spark SQL | 目前Spark社群最活躍的元件之一SparkSQL元件
- Spark SQL的官網解釋SparkSQL
- Spark SQL 開窗函式SparkSQL函式
- Flume+Spark+Hive+Spark SQL離線分析系統SparkHiveSQL
- Spark 從零到開發(五)初識Spark SQLSparkSQL
- Spark SQL:通用的load和save操作SparkSQL
- 15、Spark Sql(一),生成DataFrame的方式SparkSQL
- Spark SQL學習——DataFrame和DataSetSparkSQL
- Spark SQL,正則,regexp_replaceSparkSQL
- Spark SQL如何選擇join策略SparkSQL
- Spark SQL中的RDD與DataFrame轉換SparkSQL
- 為什麼說Spark SQL遠遠超越了MPP SQLSparkSQL
- Spark SQL日期相距天數,月數SparkSQL
- Spark SQL / Catalyst 內部原理 與 RBOSparkSQL
- Spark SQL知識點與實戰SparkSQL
- Apache Kyuubi 助力 CDH 解鎖 Spark SQLApacheSparkSQL
- 10.spark sql之快速入門SparkSQL
- Spark3學習【基於Java】3. Spark-Sql常用APISparkJavaSQLAPI
- Spark in action on Kubernetes - Spark Operator的原理解析Spark
- Spark SQL,如何將 DataFrame 轉為 json 格式SparkSQLJSON
- Spark SQL知識點大全與實戰SparkSQL
- Spark 原始碼系列(九)Spark SQL 初體驗之解析過程詳解Spark原始碼SQL
- Apache Spark SQL的高階Join連線技術ApacheSparkSQL
- Spark SQL中列轉行(UNPIVOT)的兩種方法SparkSQL