您現在的位置是:首頁 > 棋牌

大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?

  • 由 讀字Z節 發表于 棋牌
  • 2021-07-07
簡介DataFrame示例Spark SQL可以支援從很多種資料來源的結構化抽象,Spark SQL從資料來源中抽取資料集後抽象成一種具有schema結構的rdd物件:DataFrame,有點類似拿到了一個Hibernate的Session與實

spark sql是什麼

大資料平臺的SQL查詢引擎有哪些(中 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,一個將不同來源資料進行關係結構化再進行計算處理的模組。

大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?

DataFrame示例

Spark SQL可以支援從很多種資料來源的結構化抽象,Spark SQL從資料來源中抽取資料集後抽象成一種具有schema結構的rdd物件:

DataFrame

,有點類似拿到了一個Hibernate的Session與實體物件的合體(類似,可能不太恰當),可以執行類似下面例子中DataFrame(df)的查詢操作。

大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?

大家可以看到DataFrame實際上就是將資料來源結構化為SQL表列。因為DataFreame也需要進行schema定義。類似下圖:

大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?

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)。

大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?

Catalyst最佳化器

Spark SQL執行的SQL語句在Catalyst最佳化器中經歷了邏輯計劃、物理計劃兩個過程,邏輯計劃過程主要依賴Antlr。首先SQL語句在unresolved logical plan階段由antlr轉換成抽象語法樹,這時候會根據Catalog中(儲存了所有的表資訊、DataFrame資訊)的元資料,對unresolved logical plan進行表示式解析,確定表、列都存在後,才會形成真正的resolved logical plan,最後交付Catalyst最佳化器進行最佳化邏輯計劃(Optimized logical plan)。如下圖所示:

大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?

轉換成功的邏輯計劃將進入物理計劃階段,Optimized logical plan會分解為多個物理計劃(Physical Plans),最終進入代價模型(Cost Model),根據資源開銷成本,去選擇最佳的物理計劃(Best Physical Plan),最終進入到叢集中執行。如下圖所示:

大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?

Dataset

在Dataframe之後Spark推出了一個新的資料抽象:DataSet,DataSet可以理解為DataFrame的擴充套件,物件型別更為顯性,這種優勢就是在開發起來具有更友好的API風格,更適合工程化管理。

例如:我們定義了一個叫Flight的Dataset實體類

大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?

我們可以將DataFrame轉換成Flight class型別的Dataset,這時候的變數flights就是Dataset[Flight]強型別了,即具有型別安全檢查,也具有Dataframe的查詢最佳化特性。

大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?

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將中間過程資料寫入磁碟導致效能慢的關鍵原因之一。

大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?

大資料平臺的SQL查詢引擎有哪些(中 Spark SQL)?

Top