一篇文章帶你了解 SparkSQL 的發(fā)展歷史!
Hive架構(gòu)回顧

1)用戶接口:Client
CLI(command-line interface)、JDBC/ODBC(jdbc 訪問 hive)、WEBUI(瀏覽器訪問 hive)
2)元數(shù)據(jù):Metastore
元數(shù)據(jù)包括:表名、表所屬的數(shù)據(jù)庫(默認是 default)、表的擁有者、列/分區(qū)字段、表的類型(是否是外部表)、表的數(shù)據(jù)所在目錄等;
默認存儲在自帶的 derby 數(shù)據(jù)庫中,推薦使用 MySQL 存儲 Metastore
3)Hadoop
使用 HDFS 進行存儲,使用 MapReduce 進行計算。
4)驅(qū)動器:Driver
5)解析器(SQL Parser)
將 SQL 字符串轉(zhuǎn)換成抽象語法樹 AST,這一步一般都用第三方工具庫完成,比如 antlr;
對 AST 進行語法分析,比如表是否存在、字段是否存在、SQL 語義是否有誤。
6)編譯器(Physical Plan)
將 AST 編譯生成邏輯執(zhí)行計劃。
7)優(yōu)化器(Query Optimizer)
對邏輯執(zhí)行計劃進行優(yōu)化。
8)執(zhí)行器(Execution)
把邏輯執(zhí)行計劃轉(zhuǎn)換成可以運行的物理計劃。對于 Hive 來說,就是 MR/Spark。?
HQL 轉(zhuǎn)換為 MR 任務(wù)流程說明
1.進入程序,利用Antlr框架定義HQL的語法規(guī)則,對HQL完成詞法語法解析,將HQL轉(zhuǎn)換為為AST(抽象語法樹);
2.遍歷AST,抽象出查詢的基本組成單元QueryBlock(查詢塊),可以理解為最小的查詢執(zhí)行單元;
3.遍歷QueryBlock,將其轉(zhuǎn)換為OperatorTree(操作樹,也就是邏輯執(zhí)行計劃),可以理解為不可拆分的一個邏輯執(zhí)行單元;
4.使用邏輯優(yōu)化器對OperatorTree(操作樹)進行邏輯優(yōu)化。例如合并不必要的ReduceSinkOperator,減少Shuffle數(shù)據(jù)量;
5.遍歷OperatorTree,轉(zhuǎn)換為TaskTree。也就是翻譯為MR任務(wù)的流程,將邏輯執(zhí)行計劃轉(zhuǎn)換為物理執(zhí)行計劃;
6.使用物理優(yōu)化器對TaskTree進行物理優(yōu)化;
7.生成最終的執(zhí)行計劃,提交任務(wù)到Hadoop集群運行。

可以發(fā)現(xiàn)Hive框架底層就是MapReduce,所以在Hive中執(zhí)行SQL時,往往很慢很慢

Spark出現(xiàn)以后,將HiveQL語句翻譯成基于RDD操作,此時Shark框架誕生了。

前身Shark框架
Shark即Hive on Spark,本質(zhì)上是通過Hive的HQL進行解析,把HQL翻譯成Spark上對應(yīng)的RDD操作,然后通過Hive的Metadata獲取數(shù)據(jù)庫里表的信息,實際為HDFS上的數(shù)據(jù)和文件,最后有Shark獲取并放到Spark上計算。
但是Shark框架更多是對Hive的改造,替換了Hive的物理執(zhí)行引擎,使之有一個較快的處理速度。然而不容忽視的是Shark繼承了大量的Hive代碼,因此給優(yōu)化和維護帶來大量的麻煩。為了更好的發(fā)展,Databricks在2014年7月1日Spark Summit上宣布終止對Shark的開發(fā),將重點放到SparkSQL模塊上。

在許多年前(2012\2013左右)Hive逐步火熱起來, 大片搶占分布式SQL計算市場。
Spark作為通用計算框架, 也不可能放棄這一細分領(lǐng)域。于是, Spark官方模仿Hive推出了Shark框架(Spark 0.9版本)。
Shark框架是幾乎100%模仿Hive, 內(nèi)部的配置項\優(yōu)化項等都是直接模仿而來.不同的在于將執(zhí)行引擎由MapReduce更換為了Spark。
因為Shark框架太模仿Hive, Hive是針對MR優(yōu)化, 很多地方和SparkCore(RDD)水土不服, 最終被放棄。
Spark官方下決心開發(fā)一個自己的分布式SQL引擎 也就是誕生了現(xiàn)在的SparkSQL

SparkSQL模塊主要將以前依賴Hive框架代碼實現(xiàn)的功能自己實現(xiàn),稱為Catalyst引擎。

● 2014年 1.0正式發(fā)布
● 2015年 1.3? 發(fā)布DataFrame數(shù)據(jù)結(jié)構(gòu), 沿用至今
● 2016年 1.6 發(fā)布Dataset數(shù)據(jù)結(jié)構(gòu)(帶泛型的DataFrame), 適用于支持泛型的語言(Java\Scala)
● 2016年 2.0 統(tǒng)一了Dataset 和 DataFrame, 以后只有Dataset了, Python用的DataFrame就是 沒有泛型的Dataset
● 2019年 3.0 發(fā)布, 性能大幅度提升,SparkSQL變化不大

