總結:Hive,Hive on Spark和SparkSQL區別

Hive on Mapreduce

Hive的原理大家可以參考這篇大數據時代的技術hive:hive介紹,實際的一些操作可以看這篇筆記:新手的Hive指南,至于還有興趣看Hive優化方法可以看看我總結的這篇Hive性能優化上的一些總結

Hive on Mapreduce執行流程

這里寫圖片描述

執行流程詳細解析

  • Step 1:UI(user interface) 調用 executeQuery 接口,發送 HQL 查詢語句給 Driver
  • Step 2:Driver 為查詢語句創建會話句柄,并將查詢語句發送給 Compiler, 等待其進行語句解析并生成執行計劃
  • Step 3 and 4:Compiler 從 metastore 獲取相關的元數據
  • Step 5:元數據用于對查詢樹中的表達式進行類型檢查,以及基于查詢謂詞調整分區,生成計劃
  • Step 6 (6.1,6.2,6.3):由 Compiler 生成的執行計劃是階段性的 DAG,每個階段都可能會涉及到 Map/Reduce job、元數據的操作、HDFS 文件的操作,Execution Engine 將各個階段的 DAG 提交給對應的組件執行。
  • Step 7, 8 and 9:在每個任務(mapper / reducer)中,查詢結果會以臨時文件的方式存儲在 HDFS 中。保存查詢結果的臨時文件由 Execution Engine 直接從 HDFS 讀取,作為從 Driver Fetch API 的返回內容。

Hive on Mapreduce特點

  1. 關系數據庫里,表的加載模式是在數據加載時候強制確定的(表的加載模式是指數據庫存儲數據的文件格式),如果加載數據時候發現加載的數據不符合模式,關系數據庫則會拒絕加載數據,這個就叫“寫時模式”,寫時模式會在數據加載時候對數據模式進行檢查校驗的操作。Hive在加載數據時候和關系數據庫不同,hive在加載數據時候不會對數據進行檢查,也不會更改被加載的數據文件,而檢查數據格式的操作是在查詢操作時候執行,這種模式叫“讀時模式”。在實際應用中,寫時模式在加載數據時候會對列進行索引,對數據進行壓縮,因此加載數據的速度很慢,但是當數據加載好了,我們去查詢數據的時候,速度很快。但是當我們的數據是非結構化,存儲模式也是未知時候,關系數據操作這種場景就麻煩多了,這時候hive就會發揮它的優勢。
  2. 關系數據庫一個重要的特點是可以對某一行或某些行的數據進行更新、刪除操作,hive不支持對某個具體行的操作,hive對數據的操作只支持覆蓋原數據和追加數據。Hive也不支持事務和索引。更新、事務和索引都是關系數據庫的特征,這些hive都不支持,也不打算支持,原因是hive的設計是海量數據進行處理,全數據的掃描時常態,針對某些具體數據進行操作的效率是很差的,對于更新操作,hive是通過查詢將原表的數據進行轉化最后存儲在新表里,這和傳統數據庫的更新操作有很大不同。
  3. Hive也可以在hadoop做實時查詢上做一份自己的貢獻,那就是和hbase集成,hbase可以進行快速查詢,但是hbase不支持類SQL的語句,那么此時hive可以給hbase提供sql語法解析的外殼,可以用類sql語句操作hbase數據庫。
  4. Hive可以認為是MapReduce的一個封裝、包裝。Hive的意義就是在業務分析中將用戶容易編寫、會寫的Sql語言轉換為復雜難寫的MapReduce程序,從而大大降低了Hadoop學習的門檻,讓更多的用戶可以利用Hadoop進行數據挖掘分析。

與傳統數據庫之間對比—From:Hive和傳統數據庫進行比較

比較項 SQL HiveQL
ANSI SQL 支持 不完全支持
更新 UPDATE\INSERT\DELETE insert OVERWRITE\INTO TABLE
事務 支持 不支持
模式 寫模式 讀模式
數據保存 塊設備、本地文件系統 HDFS
延時
多表插入 不支持 支持
子查詢 完全支持 只能用在From子句中
視圖 Updatable Read-only
可擴展性
數據規模
.... ...... ......

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的兩個組件
  1. SQLContext:Spark SQL提供SQLContext封裝Spark中的所有關系型功能。可以用之前的示例中的現有SparkContext創建SQLContext。
  2. 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語句的順序

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

Hive on Spark

? hive on Spark是由Cloudera發起,由Intel、MapR等公司共同參與的開源項目,<font color='red'>其目的是把Spark作為Hive的一個計算引擎,將Hive的查詢作為Spark的任務提交到Spark集群上進行計算。</font>通過該項目,可以提高Hive查詢的性能,同時為已經部署了Hive或者Spark的用戶提供了更加靈活的選擇,從而進一步提高Hive和Spark的普及率。

Hive on Spark與SparkSql的區別

? hive on spark大體與SparkSQL結構類似,<font color='red'>只是SQL引擎不同,但是計算引擎都是spark!</font>敲黑板!這才是重點!

我們來看下,在pyspark中使用Hive on Spark是中怎么樣的體驗

#初始化Spark SQL
#導入Spark SQL
from pyspark.sql import HiveContext,Row
# 當不能引入Hive依賴時
# from pyspark.sql import SQLContext,Row
# 注意,上面那一點才是關鍵的,他兩來自于同一個包,你們區別能有多大


hiveCtx = HiveContext(sc)   #創建SQL上下文環境
input = hiveCtx.jsonFile(inputFile)   #基本查詢示例
input.registerTempTable("tweets")   #注冊輸入的SchemaRDD(SchemaRDD在Spark 1.3版本后已經改為DataFrame)
#依據retweetCount(轉發計數)選出推文
topTweets = hiveCtx.sql("SELECT text,retweetCount FROM tweets ORDER BY retweetCount LIMIT 10")

我們可以看到,sqlcontext和hivecontext都是出自于pyspark.sql包,可以從這里理解的話,其實hive on spark和sparksql并沒有太大差別

結構上Hive On Spark和SparkSQL都是一個翻譯層,把一個SQL翻譯成分布式可執行的Spark程序。而且大家的引擎都是spark

SparkSQL和Hive On Spark都是在Spark上實現SQL的解決方案。Spark早先有Shark項目用來實現SQL層,不過后來推翻重做了,就變成了SparkSQL。這是Spark官方Databricks的項目,Spark項目本身主推的SQL實現。Hive On Spark比SparkSQL稍晚。Hive原本是沒有很好支持MapReduce之外的引擎的,而Hive On Tez項目讓Hive得以支持和Spark近似的Planning結構(非MapReduce的DAG)。所以在此基礎上,Cloudera主導啟動了Hive On Spark。這個項目得到了IBM,Intel和MapR的支持(但是沒有Databricks)。—From SparkSQL與Hive on Spark的比較

Hive on Mapreduce和SparkSQL使用場景

Hive on Mapreduce場景

  • Hive的出現可以讓那些精通SQL技能、但是不熟悉MapReduce 、編程能力較弱與不擅長Java語言的用戶能夠在HDFS大規模數據集上很方便地利用SQL 語言查詢、匯總、分析數據,畢竟精通SQL語言的人要比精通Java語言的多得多
  • Hive適合處理離線非實時數據

SparkSQL場景

  • Spark既可以運行本地local模式,也可以以Standalone、cluster等多種模式運行在Yarn、Mesos上,還可以運行在云端例如EC2。此外,Spark的數據來源非常廣泛,可以處理來自HDFS、HBase、 Hive、Cassandra、Tachyon上的各種類型的數據。
  • 實時性要求或者速度要求較高的場所

Hive on Mapreduce和SparkSQL性能對比

具體實驗參見:Spark SQL & Spark Hive編程開發, 并和Hive執行效率對比

結論:sparksql和hive on spark時間差不多,但都比hive on mapreduce快很多,官方數據認為spark會被傳統mapreduce快10-100倍


更新

  • 2017.8.4 第一次更新,收集和整理

致謝

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容