您現在的位置是:首頁 > 棋牌
大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?
- 由 讀字Z節 發表于 棋牌
- 2021-07-07
spark sql是什麼
續
上篇
大資料平臺的SQL查詢引擎有哪些(中 Impala VS Presto )?
為了更清晰地理解Presto的架構與內部特徵,就拿Impala進行了對比,因為Presto和Impala雖然都為記憶體查詢引擎,但是完全走了一條不同的架構思路,非常值得在比較中看到它們架構之間的異同之處。本篇為中篇,會繼續對SQL查詢引擎中其他三款:Presto、Spark SQL、Phoenix的架構進行解讀和描述。
Spark SQL
Spark架構
作為大資料處理計算的大一統軟體棧Spark,或將是大資料處理領域裡面的Spring framework。我們從下圖中可以看到Spark core之上具有了四種面向不同計算領域或方式的Spark模組,Spark streaming模組面向實時流計算,具體方式採用微批處理;MLlib模組面向Spark的機器學習庫,尤其是Spark預設對Python的支援,成為Python開發者接入Hadoop生態平臺的絕佳入口;GraphX面向圖處理,有了GraphX,對於社交網路、知識庫、超文字關聯度分析、傳染病傳播預測等應用領域,都可以使用Spark來處理。
我們本次主要分析瞭解到是Spark SQL,一個將不同來源資料進行關係結構化再進行計算處理的模組。
DataFrame示例
Spark SQL可以支援從很多種資料來源的結構化抽象,Spark SQL從資料來源中抽取資料集後抽象成一種具有schema結構的rdd物件:
DataFrame
,有點類似拿到了一個Hibernate的Session與實體物件的合體(類似,可能不太恰當),可以執行類似下面例子中DataFrame(df)的查詢操作。
大家可以看到DataFrame實際上就是將資料來源結構化為SQL表列。因為DataFreame也需要進行schema定義。類似下圖:
DataFrame支援的資料來源
Spark SQL可以從哪些資料來源建立DataFrame結構化模型呢?
json:Spark自動推斷資料結構和型別
Parquet Spark的預設資料來源,自動儲存schema
Hive table Spark支援直接讀取Hive資料
JDBC Spark透過Jdbc驅動拉取Rdbms資料表資料
CSV 可根據CSV行頭定義列
……
DataFrame架構
如下圖所示:
客戶端根據自己的目標語言,Java、Python、Scala進行Spark SQL操作。
Spark SQL訪問上述的各種資料來源,建立DataFrame物件。
透過對DataFrame API的呼叫,實現SQL方式操作資料(查詢、聚合、分組等、連線等)。
Spark SQL將SQL操作語句調入Catalyst Optimizer引擎形成執行計劃。
執行計劃進入Spark處理引擎,由分佈在不同節點的Spark叢集任務並行處理SchemaRDD(DataFrame)。
Catalyst最佳化器
Spark SQL執行的SQL語句在Catalyst最佳化器中經歷了邏輯計劃、物理計劃兩個過程,邏輯計劃過程主要依賴Antlr。首先SQL語句在unresolved logical plan階段由antlr轉換成抽象語法樹,這時候會根據Catalog中(儲存了所有的表資訊、DataFrame資訊)的元資料,對unresolved logical plan進行表示式解析,確定表、列都存在後,才會形成真正的resolved logical plan,最後交付Catalyst最佳化器進行最佳化邏輯計劃(Optimized logical plan)。如下圖所示:
轉換成功的邏輯計劃將進入物理計劃階段,Optimized logical plan會分解為多個物理計劃(Physical Plans),最終進入代價模型(Cost Model),根據資源開銷成本,去選擇最佳的物理計劃(Best Physical Plan),最終進入到叢集中執行。如下圖所示:
Dataset
在Dataframe之後Spark推出了一個新的資料抽象:DataSet,DataSet可以理解為DataFrame的擴充套件,物件型別更為顯性,這種優勢就是在開發起來具有更友好的API風格,更適合工程化管理。
例如:我們定義了一個叫Flight的Dataset實體類
我們可以將DataFrame轉換成Flight class型別的Dataset,這時候的變數flights就是Dataset[Flight]強型別了,即具有型別安全檢查,也具有Dataframe的查詢最佳化特性。
Dataset在編譯時就會檢查型別是否符合規範。Dataset僅適合用於基於JVM的Scala、Java,透過case類或Javabeans指定型別。
當呼叫DataFrame的API時,返回的結果結構就是Row型別;當使用DatasetAPI時,就可以將將Row格式的每一行轉換為指定的業務領域物件(case類或Java類)
Spark叢集架構
我們可以將Hive、Impala、Presto理解為比較獨立的數倉工具,在上一篇中Impala和Presto的對比,我們甚至可以看到它們倆具有獨立的分散式架構。Hive則是Hadoop生態獨立性很高SQL解析與執行工具,插接Mapreduce、Spark、Tez計算引擎,高度依賴HDFS儲存系統。
反觀Spark SQL,它並不獨立,應是Spark平臺上的一組模組,徹底與Spark糅合在一起,因此談Spark SQL的分散式架構,其實就是在講Spark架構。我們從下圖可以看到Spark架構的特徵,在叢集計算資源排程方面與Spark無關,主要依賴Hadooop Yarn或者Mesos實現分散式叢集計算資源的排程管理。
同理Spark SQL解析完成物理計劃後就完成交由Spark叢集進行並行任務處理,Spark叢集中Driver提交作業、實現排程,Executor具體執行任務、返回結果。
Executor中透過多執行緒方式執行任務(Task),而且Executor透過堆內記憶體、堆外記憶體管理,實現高效能的記憶體計算,這點是Spark效能上優於Mapreduce將中間過程資料寫入磁碟導致效能慢的關鍵原因之一。