2016-05-12 115 views
0

我在研究催化劑優化器的各個階段,但我有些懷疑這三個第一階段在實踐中是如何工作的。催化劑優化階段

在第一階段(分析階段),otimizer將創建查詢的邏輯計劃。但是這裏的列沒有解決,所以它需要爲此使用一個目錄對象。

懷疑:你知道這個目錄對象是如何工作的嗎?例如,如果我們在hive表上執行查詢,優化器連接到hdfs中的hivetables來解析列?

在第二階段(邏輯優化),otimizer將標準規則應用於邏輯計劃,如常量摺疊,謂詞下推和項目修剪。

懷疑:我試着找例子來更好地理解什麼火花確實在這個階段,不斷摺疊,謂語pushsdown和項目修剪事情如何幫助優化查詢,但林沒有找到關於這個沒什麼混凝土。

在第三階段(物理計劃),spark使用符合Spark執行引擎的物理操作符來計算邏輯計劃並生成一個或多個物理計劃。

懷疑:您是否理解這部分內容「使用與火花執行引擎匹配的物理操作符」?

回答

1

你知道這個目錄對象是如何工作的嗎?例如,如果我們在hive表上執行查詢,優化器連接到hdfs中的hivetables來解析列?

這裏沒有單一的答案。基本目錄是SessionCatalog,它僅作爲實際ExternalCatalog的代理。 Spark提供了開箱即用的ExternalCatalog的兩種不同實現:InMemoryCatalogHiveExternalCatalog,分別對應於標準SQLContextHiveContext。顯然,前者可能訪問Hive Metastore,但應該沒有其他數據訪問。

在火花2.0+目錄可以直接使用SparkSession.catalog例如被查詢:

val df = Seq(("a", 1), ("b", 2)).toDF("k", "v") 
// df: org.apache.spark.sql.DataFrame = [k: string, v: int] 

spark.catalog.listTables 
// org.apache.spark.sql.Dataset[org.apache.spark.sql.catalog.Table] = 
// [name: string, database: string ... 3 more fields] 

常量合併

這不是特定於催化劑的任何特定方式。這只是一個standard compilation technique,它的好處應該是顯而易見的。這是更好地計算表達式一旦超過這個重複的每一行

謂詞下推

謂詞對應於SQL查詢WHERE條款。如果這些可以直接用於外部系統(like relational database)或用於分區修剪(如在Parquet中),這意味着需要從磁盤傳輸/加載的數據量減少。

和項目修剪

好處是幾乎一樣的謂詞下推。如果某些列未使用,則下游數據源可能會在讀取時丟棄該列。

你使用的物理運算符

DataFrame僅僅是一個高層次的抽象理解這部分內容。內部操作必須轉化爲RDD的基本操作,通常是mapPartitions的一些組合。

+0

謝謝你的回答。我只是懷疑謂詞下推,所以它似乎有助於減少整個網絡的數據量。所以這只是關於使用where子句,所以我們可以過濾結果,因此整個網絡的數據傳輸量更少? – codin

+0

我會說在一般情況下減少IO。 – zero323