spark SQL優化器catalyst學習

一、Catalyst 概述

  1. Catalyst 是 Spark SQL 的優化器,它負責將 SQL 查詢轉換為物理執行計劃。Catalyst 優化器的目標是生成高效的執行計劃,以最小化查詢的執行時間。它使用了多種優化技術,包括基于規則的優化、基于代價的優化和動態規劃等。
  2. 我們寫的SQL語句,會經過一個優化器(catalyst),轉化為RDD,交給集群執行。
    select * from table_a
  3. 語法。select * table_a
  4. 詞法。selectS * from table_a
  5. AST。abstract syntax tree / 抽象語法樹 / 語法樹 / syntax tree
    暫時無法在飛書文檔外展示此內容
  6. 解析引擎:負責將SQL解析成task。Catalyst的地位類似于Calcite(負責Hive SQL解析優化),Spark SQL獨有的Catalyst,解析優化。
  7. MySQL
  8. Hive SQL
  9. Spark SQL
  10. Flink SQL
  11. Doris
  12. Presto
  13. 計算引擎:task是誰來執行。
  14. MySQL
  15. MapReduce
  16. Spark
  17. Tez
  18. Flink
  • Spark on Hive和 Hive on spark的區別?
    • Hive on Spark:Hive是Hive SQL,解析引擎;Spark是計算引擎。
    • Spark on Hive:
      • Hive
        1. 代表是數倉(常見的分層);
        2. 理解:Hive SQL,解析引擎。
      • Spark:代表解析引擎、計算引擎。
      • 含義:通過spark SQL做數倉,層與層的轉換。
  • SQL到RDD中間經過了一個Catalyst,它就是SparkSQL的核心,是計對 Spark SQL語句執行過程中的查詢優化框架,基于Scala函數式編程結構。
  • RDD的運行流程:RDD->DAGScheduler ->TaskScheduler->worrker,任務會按照代碼所示運行,依賴開發者的優化,開發者的會在很大程度上影響運行效率。而SparkSQL的Dataset和SQL并不是直接生成計劃交給集群執行,而是經過Catalyst的優化器,這個優化器能夠自動幫助開發者優化代碼
  • 我們要了解SparkSQL的執行流程,那么理解Catalyst的工作流程是非常有必要的。
    二、 Catalyst 的優化過程
    暫時無法在飛書文檔外展示此內容
    Catalyst 的優化過程大致可以分為以下幾個階段:
  1. 解析 ( Parsing ):將 SQL 查詢解析為抽象語法樹 ( AST )。parser模塊目前都是使用第三方類庫ANTLR進行實現的。在這個過程匯總,會判斷SQL語句是否符合規范,比如select from where等這些關鍵字是否寫對。
    暫時無法在飛書文檔外展示此內容
  2. 分析 ( Analysis ):對 AST 進行語義分析,檢查查詢的合法性和完整性。該模塊會遍歷整個AST,并對AST上的每個節點進行數據類型綁定以及函數綁定,然后根據源數據信息系catelog對數據表中的字段進行解析,此過程會判斷SQL語句的表名,字段名是否真的在元數據庫里存在。元數據信息主要包括兩部分:表的scheme和基本函數信息。
  3. 表的scheme:
    1. 基本定義。列名,數據類型。
    2. 表的數據格式。json、text
    3. 表的物理位置。
  4. 基本函數
    暫時無法在飛書文檔外展示此內容
  5. 優化 ( Optimization ):應用各種優化規則和策略,生成不同的執行計劃。主要分為RBO和CBO兩種優化策略,其中RBO(Rule-Based Optimizer)是基于規則優化,CBO(Cost-Based Optimizer)是基于代價優化。常見的規則有:
  • 謂詞下推predicate Pushdown:將過濾操作下推到join之前進行,之后在進行join的時候,數據量將會顯著的減少,join耗時必然降低。
    暫時無法在飛書文檔外展示此內容
select*
from table1
inner jointable2
on table1.id = table2.id
where table1.age > 20and table2.cid = 1

上面的語句會自動優化為如下所示:

select*
from 
(select *fromtable1where table1.age > 20
)    a
inner join
(select *fromtable2where table2.cid = 1
)    b
on a.id = b.id

即在資產許那階段就提前將數據進行過濾,后續的join和shuffle數據量會大大減少。

  • 列值裁剪column pruning:在謂詞下推后,可以把表中沒有用到的列裁剪掉,這一優化一方面大幅度減少了網絡,內存的數據量消耗,另一方面對于劣勢存儲數據庫來說大大提高了掃描效率。
selecta.name,a.age,b.cid
from 
(select *fromtable1where table1.age > 20
)    a
inner join
(select *fromtable2where table2.cid = 1
)    b
on a.id = b.id

上面的語句會自動優化如下圖所示:

selecta.name,a.age,b.cid
from 
(select name,agefromtable1where table1.age > 20
)    a
inner join
(select cidfromtable2where table2.cid = 1
)    b
on a.id = b.id

就是提前將需要的列查詢出來,其他不需要的列裁剪掉。

  • 常量累加 constant folding:比如計算 x + (100 + 80) -> x + 180,雖然是一個很小的改動,但是意義巨大。如果沒有進行優化,每一條結果都需要執行一次100 + 80的操作,然后再與結果相加,優化后就不需要再次執行100 + 80的操作。
select 1 + 1 id
fromtable1

上面的語句會自動優化如下圖所示:

select 2 id
fromtable1

就是會提前將1 + 1計算成2,再賦給id列的每行,不用每次都計算一次1+1
4. SparkPlanner模塊:

  1. 將優化后的邏輯執行計劃(OptimizedLogicalPlan)轉換成Physical Plan(物理計劃),也就是Spark可以真正的執行的計劃。比如join算子,Spark根據不同常見為該算子制定了不同的算法策略,有BroadCastHashJoin,ShuffleHashJoin以及SortMergeJoin等,物理執行假話實際上就是在這些具體實現中挑選一個耗時最小的算法實現。
  2. 具體的實現手段:
    1. SparkPlanner對優化后的邏輯計劃進行換算,是生成了多個可以執行的物理計劃Physical Plan;接著CBO(基于代價優化)優化策略或根據Cost Model算出每個Physical Plan的代價,并選取最小代價的Physical Plan作最終的Physical Plan。
    2. CostmModel模塊:主要根據過去的性能統計數據,選擇最佳的物理執行計劃,這個過程的優化就是CBO(基于代價優化)
    備注:以上2、3、4步驟結合起來,就是catalyst優化器。
  3. 執行物理計劃:最后一句最優的物理執行計劃,生成Java字節碼,將SQL轉化為DAG,以RDD的形式進行操作
  4. 選擇 ( Selection ):根據代價模型選擇最優的執行計劃。
  5. 代碼生成 ( Code Generation ):將優化后的執行計劃轉換為 Spark 代碼。
    三、 Catalyst 的優化規則
    Catalyst 提供了許多優化規則,用于改進查詢的執行計劃。以下是一些常見的優化規則:
  6. 列剪枝 ( Column Pruning ):刪除不必要的列,減少數據傳輸。
  7. 分區剪枝 ( Partition Pruning ):根據分區過濾條件,只讀取必要的分區。
  8. 謂詞下推 ( Predicate Pushdown ):將過濾條件盡可能地向下推送到數據源,減少數據的讀取量。
  9. 聚合優化 ( Aggregation Optimization ):合并相同的聚合操作,避免重復計算。
  10. 連接優化 ( Join Optimization ):選擇合適的連接算法,優化連接操作。
    四、 Catalyst 的代價模型
    Catalyst 采用了基于規則的代價模型來評估執行計劃的代價。代價模型考慮了以下因素:
  11. 數據量 ( Data Volume ):表的數據大小和分區數。
  12. 計算資源 ( Compute Resources ):CPU、內存和網絡帶寬等。
  13. I/O 開銷 ( I/O Overhead ):數據讀取和寫入的開銷。
  14. 數據傾斜 ( Data Skew ):數據分布不均衡導致的性能問題。
    五、 Catalyst 的代碼生成
    Catalyst 將優化后的執行計劃轉換為 Spark 代碼,包括RDD操作和SQL表達式。代碼生成過程使用了模板和宏來實現代碼的重用和簡潔性。
    六、總結
    Spark SQL 的 Catalyst 優化器是一個強大而靈活的優化框架,它采用了多種優化技術和策略,以生成高效的執行計劃。了解 Catalyst 的優化過程和規則,可以幫助我們更好地編寫高效的 Spark SQL 查詢。

以上是一個關于 Spark SQL 優化器 Catalyst 的學習文檔,希望對你有所幫助。如果你有任何問題或建議,請隨時與我交流。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20677.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20677.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20677.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Dijkstra求最短路篇二(全網最詳細講解兩種方法,適合小白)(python,其他語言也適用)

前言: Dijkstra算法博客講解分為兩篇講解,這兩篇博客對所有有難點的問題都會講解,小白也能很好理解。看完這兩篇博客后保證收獲滿滿。 第一篇博客講解樸素Dijkstra算法Dijkstra求最短路篇一(全網最詳細講解兩種方法,適合小白)(p…

openstack 中如何檢查VLAN 配置: 確保正確配置了兩個 VLAN,并且兩個 VLAN 之間進行了正確的路由。

在 OpenStack 中檢查 VLAN 配置并確保兩個 VLAN 之間進行了正確的路由,可以按照以下步驟進行操作: 查看網絡配置: 登錄到 OpenStack 控制節點上的命令行界面。使用 neutron net-list 命令查看當前存在的網絡列表。找到與你關注的 VLAN 相關的…

計網ppt標黃知識點整理第(2)章節——謝希仁版本、期末復習自用

物理層考慮的是怎樣才能在連接各種計算機的傳輸媒體上傳輸數據比特流,而不是指具體的傳輸媒體。4 個特性: 機械特性:指明接口所用接線器的形狀和尺寸、引線數目和排列、固定和鎖定裝置等。 電氣特性:指明在接口電纜的各條線上出現…

如何在 JS 中快速讀取文件

本文翻譯自 How to read files quickly in JavaScript,作者:Daniel Lemire, 略有刪改。 假設你需要在服務器上使用JavaScript讀取多個文件。在像Node.js這樣的運行時環境中,JavaScript有多種讀取文件的方式。哪一種是最好的呢&…

Linux軟件安裝包rpm與tgz格式的區別

rpm與tgz的區別 1、Linux軟件包的內容分類2、Linux軟件包的格式分類 1、Linux軟件包的內容分類 Linux應用程序的軟件包按內容類別可分為兩類: 可執行文件(編譯后的二進制軟件包) 解包后可以直接運行,看不到源代碼。例如&#xff0…

基于Springboot駕校預約平臺小程序的設計與實現(源碼+數據庫+文檔)

一.項目介紹 系統角色:管理員、教練、學員 小程序(僅限于學員注冊、登錄): 查看管理員發布的公告信息 查看管理員發布的駕校信息 查看所有教練信息、預約(需教練審核)、評論、收藏喜歡的教練 查看管理員發布的考試信息、預約考試(需管理…

代碼隨想錄算法訓練營Day8|541. 反轉字符串II、替換數字、151.翻轉字符串里的單詞、卡碼網:55.右旋轉字符串

541. 反轉字符串II 1.這道題剛開始把題意理解錯了,以為對于任意長度的字符串都只反轉[0,k-1]以及[2k,3k-1]區間的值。 2.但實際上是要把一個字符串分成若干長度為2k的小區間,反轉前[0,k-1]的字符串,[k,2k-1]保持不變; 3.如果有一個區間字符串…

2024年東北師范CCPC

文章目錄 A.Paper WateringB.nIM gAMEE.Checksum A.Paper Watering 思路:題目說有平方和開方兩種操作,如果這個數是平方數,那么它開方之后就只能開方,如果平方的話就重復了,反之就有開方和平方兩種操作。 代碼如下 //…

為了方便看公眾號文章,我搭建了個博客,在線看公眾號所有歷史文章,想看哪天的文章一秒就能找到

公眾號沒有個網頁版的文章列表,只能在電腦和手機客戶端看,想看之前的歷史文章只能一直往下拉,想找某篇文章非常費勁。 為了方便看公眾號文章,我搭建了個博客,博客地址https://sushengbuhuo.github.io/blog &#xf…

通過 SFP 接口實現千兆光纖以太網通信1

基于米聯客ARTIX-7 系列開發板及其開發手冊。 總體實現框圖如下: SFP 接口 SFP 信號定義如下圖所示。 Tri Mode Ethernet MAC 設置 由于使用千兆通訊,因此將速率設為 1Gbps。如下圖所示。 首先,由于該 IP 需要與 IP 核 1G/2.5G Ethernet …

基于IoTDB 平臺的學習和研究

Apache IoTDB(物聯網數據庫)是一個針對物聯網領域的高性能原生數據庫,適用于數據管理和分析,并可在邊緣計算和云端部署。由于它輕量級的架構、高性能和豐富的功能集,以及與Apache Hadoop、Spark和Flink的深度集成&…

【面試】生成class文件的編譯器有哪些?

目錄 1. 說明2. javac3. IDE(集成開發環境)中的編譯器3.1 Eclipse編譯器3.2 IntelliJ IDEA編譯器 1. 說明 1.javac和IDE中的編譯器是最常用的和主要的。2.這些編譯器都能夠將Java源代碼編譯為可在JVM上執行的字節碼文件,是實現Java跨平臺特性的關鍵。3.選擇編譯器時…

數據管理知識體系必知的14張語境關系圖

近期對數據管理知識體系中的語境關系圖進行了整體學習梳理,總共有14張圖,具體如下,供大家參考。應該說語境關系圖和環境因素六邊形圖是各有側重、互為補充關系。語境關系圖是環境因素六邊形圖的細化,描述了每個知識領域中的細節,相當于數據管理的微觀視角, 包括與人員、 …

kali中切換python版本

kali中切換python版本 在日常使用的過程中,可以通過一些工具來做打靶環境,或者工具的啟動,都和python關聯,而有時存在工具安裝,或者運行的時候出現報錯,這時候極大可能是因為我們本地的kali中python的版本不…

Android Studio | 小白如何運行別人的安卓項目

目錄 Step1:正確地打開項目 Step2:AS 同步時報錯 Step3:同步完成后啟動 Step4:啟動成功 說明:本文簡稱 Android Studio 為 AS Step1:正確地打開項目 重點:確認好項目的根目錄是哪個目錄&am…

進程與線程(三)

進程與線程(三) 進程間通信傳統間的進程間通信機制無名管道無名管道的特征無名管道的創建父子進程通信測試管道的大小管道讀寫易出現的問題 有名管道創建有名管道有名管道的寫端代碼有名管道的讀端代碼 信號信號的特征產生信號硬件來源軟件來源發送信號的…

Linux chmod 命令

Linux chmod 命令 在 Linux 操作系統中,chmod 命令是非常重要的。它可以用于修改文件和目錄的訪問權限,以及控制用戶對系統資源的訪問。在這篇博客中,我們將深入探討 chmod 命令的使用方法,以及如何使用它來管理文件和目錄的訪問…

什么是主碼,什么是候選碼,主碼的候選碼的區別是什么

目錄 一、候選碼 (Candidate Key) 1.定義 2.特點 二、主碼 (Primary Key) 1.定義 2.特點 三、關系和區別 1.關系 2.區別 一、候選碼 (Candidate Key) 1.定義 候選碼是能夠唯一標識數據庫表中每一條記錄的屬性集合。一個表可以有一個或多個候選碼。 2.特點 每個候選…

【U-Boot 源碼深度解析】000 - 文章鏈接匯總

【U-Boot 源碼深度解析】000 - 文章鏈接匯總 下載鏈接 https://ftp.denx.de/pub/u-boot/ 《【U-Boot 源碼深度解析】001 - Ubuntu 24.04 虛擬機 及 基礎環境搭建》

ORACLE RAC的一些基本理論知識

一 . Oracle RAC 的發展歷程 1. Oracle Parallel Server (OPS) 早期階段:Oracle 6 和 7 Oracle Parallel Server(OPS)是 Oracle RAC 的前身。 通過多個實例并行訪問同一個數據庫來提高性能。 共享磁盤架構,利用分布式鎖管理&am…