1. 程式人生 > >Hive:Hive on Spark和SparkSQL區別

Hive:Hive on Spark和SparkSQL區別

SparkSQL

SparkSQL簡介

SparkSQL的前身是Shark,給熟悉RDBMS但又不理解MapReduce的技術人員提供快速上手的工具,hive應運而生,它是當時唯一執行在Hadoop上的SQL-on-hadoop工具。但是MapReduce計算過程中大量的中間磁碟落地過程消耗了大量的I/O,降低的執行效率,為了提高SQL-on-Hadoop的效率,Shark應運而生,但又因為Shark對於Hive的太多依賴(如採用Hive的語法解析器、查詢優化器等等),2014年spark團隊停止對Shark的開發,將所有資源放SparkSQL專案上


​ 其中SparkSQL作為Spark生態的一員繼續發展,而不再受限於Hive,只是相容Hive;而Hive on Spark是一個Hive的發展計劃,該計劃將Spark作為Hive的底層引擎之一,也就是說,Hive將不再受限於一個引擎,可以採用Map-Reduce、Tez、Spark等引擎。
SparkSQL的兩個元件

SQLContext:Spark SQL提供SQLContext封裝Spark中的所有關係型功能。可以用之前的示例中的現有SparkContext建立SQLContext。
DataFrame:DataFrame是一個分散式的,按照命名列的形式組織的資料集合。DataFrame基於R語言中的data frame概念,與關係型資料庫中的資料庫表類似。通過呼叫將DataFrame的內容作為行RDD(RDD of Rows)返回的rdd方法,可以將DataFrame轉換成RDD。可以通過如下資料來源建立DataFrame:已有的RDD、結構化資料檔案、JSON資料集、Hive表、外部資料庫。
SparkSQL執行架構

類似於關係型資料庫,SparkSQL也是語句也是由Projection(a1,a2,a3)、Data Source(tableA)、Filter(condition)組成,分別對應sql查詢過程中的Result、Data Source、Operation,也就是說SQL語句按Operation–>Data Source–>Result的次序來描述的。


當執行SparkSQL語句的順序
對讀入的SQL語句進行解析(Parse),分辨出SQL語句中哪些詞是關鍵詞(如SELECT、FROM、WHERE),哪些是表示式、哪些是Projection、哪些是Data Source等,從而判斷SQL語句是否規範; 
Projection:簡單說就是select選擇的列的集合,參考:SQL Projection
將SQL語句和資料庫的資料字典(列、表、檢視等等)進行繫結(Bind),如果相關的Projection、Data Source等都是存在的話,就表示這個SQL語句是可以執行的;
一般的資料庫會提供幾個執行計劃,這些計劃一般都有執行統計資料,資料庫會在這些計劃中選擇一個最優計劃(Optimize);
計劃執行(Execute),按Operation–>Data Source–>Result的次序來進行的,在執行過程有時候甚至不需要讀取物理表就可以返回結果,比如重新執行剛執行過的SQL語句,可能直接從資料庫的緩衝池中獲取返回結果。
Hive on Spark

​ hive on Spark是由Cloudera發起,由Intel、MapR等公司共同參與的開源專案,其目的是把Spark作為Hive的一個計算引擎,將Hive的查詢作為Spark的任務提交到Spark叢集上進行計算。通過該專案,可以提高Hive查詢的效能,同時為已經部署了Hive或者Spark的使用者提供了更加靈活的選擇,從而進一步提高Hive和Spark的普及率。
Hive on Spark與SparkSql的區別

​ hive on spark大體與SparkSQL結構類似,只是SQL引擎不同,但是計算引擎都是spark!

原文參考: