總結(jié):Hive,Hive on Spark和SparkSQL區(qū)別

Hive on Mapreduce

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

Hive on Mapreduce執(zhí)行流程

這里寫(xiě)圖片描述

執(zhí)行流程詳細(xì)解析

  • Step 1:UI(user interface) 調(diào)用 executeQuery 接口警儒,發(fā)送 HQL 查詢(xún)語(yǔ)句給 Driver
  • Step 2:Driver 為查詢(xún)語(yǔ)句創(chuàng)建會(huì)話(huà)句柄训裆,并將查詢(xún)語(yǔ)句發(fā)送給 Compiler, 等待其進(jìn)行語(yǔ)句解析并生成執(zhí)行計(jì)劃
  • Step 3 and 4:Compiler 從 metastore 獲取相關(guān)的元數(shù)據(jù)
  • Step 5:元數(shù)據(jù)用于對(duì)查詢(xún)樹(shù)中的表達(dá)式進(jìn)行類(lèi)型檢查蜀铲,以及基于查詢(xún)謂詞調(diào)整分區(qū)边琉,生成計(jì)劃
  • Step 6 (6.1,6.2记劝,6.3):由 Compiler 生成的執(zhí)行計(jì)劃是階段性的 DAG变姨,每個(gè)階段都可能會(huì)涉及到 Map/Reduce job、元數(shù)據(jù)的操作厌丑、HDFS 文件的操作定欧,Execution Engine 將各個(gè)階段的 DAG 提交給對(duì)應(yīng)的組件執(zhí)行。
  • Step 7, 8 and 9:在每個(gè)任務(wù)(mapper / reducer)中怒竿,查詢(xún)結(jié)果會(huì)以臨時(shí)文件的方式存儲(chǔ)在 HDFS 中砍鸠。保存查詢(xún)結(jié)果的臨時(shí)文件由 Execution Engine 直接從 HDFS 讀取,作為從 Driver Fetch API 的返回內(nèi)容耕驰。

Hive on Mapreduce特點(diǎn)

  1. 關(guān)系數(shù)據(jù)庫(kù)里爷辱,表的加載模式是在數(shù)據(jù)加載時(shí)候強(qiáng)制確定的(表的加載模式是指數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的文件格式),如果加載數(shù)據(jù)時(shí)候發(fā)現(xiàn)加載的數(shù)據(jù)不符合模式朦肘,關(guān)系數(shù)據(jù)庫(kù)則會(huì)拒絕加載數(shù)據(jù)饭弓,這個(gè)就叫“寫(xiě)時(shí)模式”,寫(xiě)時(shí)模式會(huì)在數(shù)據(jù)加載時(shí)候?qū)?shù)據(jù)模式進(jìn)行檢查校驗(yàn)的操作媒抠。Hive在加載數(shù)據(jù)時(shí)候和關(guān)系數(shù)據(jù)庫(kù)不同弟断,hive在加載數(shù)據(jù)時(shí)候不會(huì)對(duì)數(shù)據(jù)進(jìn)行檢查,也不會(huì)更改被加載的數(shù)據(jù)文件趴生,而檢查數(shù)據(jù)格式的操作是在查詢(xún)操作時(shí)候執(zhí)行阀趴,這種模式叫“讀時(shí)模式”。在實(shí)際應(yīng)用中冲秽,寫(xiě)時(shí)模式在加載數(shù)據(jù)時(shí)候會(huì)對(duì)列進(jìn)行索引舍咖,對(duì)數(shù)據(jù)進(jìn)行壓縮,因此加載數(shù)據(jù)的速度很慢锉桑,但是當(dāng)數(shù)據(jù)加載好了排霉,我們?nèi)ゲ樵?xún)數(shù)據(jù)的時(shí)候,速度很快。但是當(dāng)我們的數(shù)據(jù)是非結(jié)構(gòu)化攻柠,存儲(chǔ)模式也是未知時(shí)候球订,關(guān)系數(shù)據(jù)操作這種場(chǎng)景就麻煩多了,這時(shí)候hive就會(huì)發(fā)揮它的優(yōu)勢(shì)瑰钮。
  2. 關(guān)系數(shù)據(jù)庫(kù)一個(gè)重要的特點(diǎn)是可以對(duì)某一行或某些行的數(shù)據(jù)進(jìn)行更新冒滩、刪除操作,hive不支持對(duì)某個(gè)具體行的操作浪谴,hive對(duì)數(shù)據(jù)的操作只支持覆蓋原數(shù)據(jù)和追加數(shù)據(jù)开睡。Hive也不支持事務(wù)和索引。更新苟耻、事務(wù)和索引都是關(guān)系數(shù)據(jù)庫(kù)的特征篇恒,這些hive都不支持,也不打算支持凶杖,原因是hive的設(shè)計(jì)是海量數(shù)據(jù)進(jìn)行處理胁艰,全數(shù)據(jù)的掃描時(shí)常態(tài),針對(duì)某些具體數(shù)據(jù)進(jìn)行操作的效率是很差的智蝠,對(duì)于更新操作腾么,hive是通過(guò)查詢(xún)將原表的數(shù)據(jù)進(jìn)行轉(zhuǎn)化最后存儲(chǔ)在新表里,這和傳統(tǒng)數(shù)據(jù)庫(kù)的更新操作有很大不同杈湾。
  3. Hive也可以在hadoop做實(shí)時(shí)查詢(xún)上做一份自己的貢獻(xiàn)解虱,那就是和hbase集成,hbase可以進(jìn)行快速查詢(xún)漆撞,但是hbase不支持類(lèi)SQL的語(yǔ)句饭寺,那么此時(shí)hive可以給hbase提供sql語(yǔ)法解析的外殼,可以用類(lèi)sql語(yǔ)句操作hbase數(shù)據(jù)庫(kù)叫挟。
  4. Hive可以認(rèn)為是MapReduce的一個(gè)封裝、包裝限煞。Hive的意義就是在業(yè)務(wù)分析中將用戶(hù)容易編寫(xiě)抹恳、會(huì)寫(xiě)的Sql語(yǔ)言轉(zhuǎn)換為復(fù)雜難寫(xiě)的MapReduce程序,從而大大降低了Hadoop學(xué)習(xí)的門(mén)檻署驻,讓更多的用戶(hù)可以利用Hadoop進(jìn)行數(shù)據(jù)挖掘分析奋献。

與傳統(tǒng)數(shù)據(jù)庫(kù)之間對(duì)比—From:Hive和傳統(tǒng)數(shù)據(jù)庫(kù)進(jìn)行比較

比較項(xiàng) SQL HiveQL
ANSI SQL 支持 不完全支持
更新 UPDATE\INSERT\DELETE insert OVERWRITE\INTO TABLE
事務(wù) 支持 不支持
模式 寫(xiě)模式 讀模式
數(shù)據(jù)保存 塊設(shè)備、本地文件系統(tǒng) HDFS
延時(shí)
多表插入 不支持 支持
子查詢(xún) 完全支持 只能用在From子句中
視圖 Updatable Read-only
可擴(kuò)展性
數(shù)據(jù)規(guī)模
.... ...... ......

SparkSQL

SparkSQL簡(jiǎn)介

SparkSQL的前身是Shark旺上,給熟悉RDBMS但又不理解MapReduce的技術(shù)人員提供快速上手的工具瓶蚂,hive應(yīng)運(yùn)而生,它是當(dāng)時(shí)唯一運(yùn)行在Hadoop上的SQL-on-hadoop工具宣吱。但是MapReduce計(jì)算過(guò)程中大量的中間磁盤(pán)落地過(guò)程消耗了大量的I/O窃这,降低的運(yùn)行效率,為了提高SQL-on-Hadoop的效率征候,Shark應(yīng)運(yùn)而生杭攻,但又因?yàn)镾hark對(duì)于Hive的太多依賴(lài)(如采用Hive的語(yǔ)法解析器祟敛、查詢(xún)優(yōu)化器等等),2014年spark團(tuán)隊(duì)停止對(duì)Shark的開(kāi)發(fā),將所有資源放SparkSQL項(xiàng)目上

? 其中SparkSQL作為Spark生態(tài)的一員繼續(xù)發(fā)展兆解,而不再受限于Hive馆铁,只是兼容Hive;而Hive on Spark是一個(gè)Hive的發(fā)展計(jì)劃锅睛,該計(jì)劃將Spark作為Hive的底層引擎之一埠巨,也就是說(shuō),Hive將不再受限于一個(gè)引擎现拒,可以采用Map-Reduce辣垒、Tez、Spark等引擎具练。

  • SparkSQL的兩個(gè)組件
  1. SQLContext:Spark SQL提供SQLContext封裝Spark中的所有關(guān)系型功能乍构。可以用之前的示例中的現(xiàn)有SparkContext創(chuàng)建SQLContext扛点。
  2. DataFrame:DataFrame是一個(gè)分布式的哥遮,按照命名列的形式組織的數(shù)據(jù)集合。DataFrame基于R語(yǔ)言中的data frame概念陵究,與關(guān)系型數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)表類(lèi)似眠饮。通過(guò)調(diào)用將DataFrame的內(nèi)容作為行RDD(RDD of Rows)返回的rdd方法,可以將DataFrame轉(zhuǎn)換成RDD铜邮∫钦伲可以通過(guò)如下數(shù)據(jù)源創(chuàng)建DataFrame:已有的RDD、結(jié)構(gòu)化數(shù)據(jù)文件松蒜、JSON數(shù)據(jù)集扔茅、Hive表、外部數(shù)據(jù)庫(kù)秸苗。

SparkSQL運(yùn)行架構(gòu)

類(lèi)似于關(guān)系型數(shù)據(jù)庫(kù)召娜,SparkSQL也是語(yǔ)句也是由Projection(a1,a2惊楼,a3)玖瘸、Data Source(tableA)、Filter(condition)組成檀咙,分別對(duì)應(yīng)sql查詢(xún)過(guò)程中的Result雅倒、Data Source、Operation弧可,也就是說(shuō)SQL語(yǔ)句按Operation–>Data Source–>Result的次序來(lái)描述的蔑匣。

當(dāng)執(zhí)行SparkSQL語(yǔ)句的順序

  1. 對(duì)讀入的SQL語(yǔ)句進(jìn)行解析(Parse),分辨出SQL語(yǔ)句中哪些詞是關(guān)鍵詞(如SELECT、FROM殖演、WHERE)氧秘,哪些是表達(dá)式、哪些是Projection趴久、哪些是Data Source等丸相,從而判斷SQL語(yǔ)句是否規(guī)范;
    • Projection:簡(jiǎn)單說(shuō)就是select選擇的列的集合彼棍,參考:SQL Projection
  2. 將SQL語(yǔ)句和數(shù)據(jù)庫(kù)的數(shù)據(jù)字典(列灭忠、表、視圖等等)進(jìn)行綁定(Bind)座硕,如果相關(guān)的Projection弛作、Data Source等都是存在的話(huà),就表示這個(gè)SQL語(yǔ)句是可以執(zhí)行的华匾;
  3. 一般的數(shù)據(jù)庫(kù)會(huì)提供幾個(gè)執(zhí)行計(jì)劃映琳,這些計(jì)劃一般都有運(yùn)行統(tǒng)計(jì)數(shù)據(jù),數(shù)據(jù)庫(kù)會(huì)在這些計(jì)劃中選擇一個(gè)最優(yōu)計(jì)劃(Optimize)蜘拉;
  4. 計(jì)劃執(zhí)行(Execute)萨西,按Operation–>Data Source–>Result的次序來(lái)進(jìn)行的,在執(zhí)行過(guò)程有時(shí)候甚至不需要讀取物理表就可以返回結(jié)果旭旭,比如重新運(yùn)行剛運(yùn)行過(guò)的SQL語(yǔ)句谎脯,可能直接從數(shù)據(jù)庫(kù)的緩沖池中獲取返回結(jié)果。

Hive on Spark

? hive on Spark是由Cloudera發(fā)起持寄,由Intel源梭、MapR等公司共同參與的開(kāi)源項(xiàng)目,<font color='red'>其目的是把Spark作為Hive的一個(gè)計(jì)算引擎稍味,將Hive的查詢(xún)作為Spark的任務(wù)提交到Spark集群上進(jìn)行計(jì)算废麻。</font>通過(guò)該項(xiàng)目,可以提高Hive查詢(xún)的性能模庐,同時(shí)為已經(jīng)部署了Hive或者Spark的用戶(hù)提供了更加靈活的選擇脑溢,從而進(jìn)一步提高Hive和Spark的普及率。

Hive on Spark與SparkSql的區(qū)別

? hive on spark大體與SparkSQL結(jié)構(gòu)類(lèi)似赖欣,<font color='red'>只是SQL引擎不同,但是計(jì)算引擎都是spark验庙!</font>敲黑板顶吮!這才是重點(diǎn)!

我們來(lái)看下粪薛,在pyspark中使用Hive on Spark是中怎么樣的體驗(yàn)

#初始化Spark SQL
#導(dǎo)入Spark SQL
from pyspark.sql import HiveContext,Row
# 當(dāng)不能引入Hive依賴(lài)時(shí)
# from pyspark.sql import SQLContext,Row
# 注意悴了,上面那一點(diǎn)才是關(guān)鍵的,他兩來(lái)自于同一個(gè)包,你們區(qū)別能有多大


hiveCtx = HiveContext(sc)   #創(chuàng)建SQL上下文環(huán)境
input = hiveCtx.jsonFile(inputFile)   #基本查詢(xún)示例
input.registerTempTable("tweets")   #注冊(cè)輸入的SchemaRDD(SchemaRDD在Spark 1.3版本后已經(jīng)改為DataFrame)
#依據(jù)retweetCount(轉(zhuǎn)發(fā)計(jì)數(shù))選出推文
topTweets = hiveCtx.sql("SELECT text,retweetCount FROM tweets ORDER BY retweetCount LIMIT 10")

我們可以看到湃交,sqlcontext和hivecontext都是出自于pyspark.sql包熟空,可以從這里理解的話(huà),其實(shí)hive on spark和sparksql并沒(méi)有太大差別

結(jié)構(gòu)上Hive On Spark和SparkSQL都是一個(gè)翻譯層搞莺,把一個(gè)SQL翻譯成分布式可執(zhí)行的Spark程序息罗。而且大家的引擎都是spark

SparkSQL和Hive On Spark都是在Spark上實(shí)現(xiàn)SQL的解決方案。Spark早先有Shark項(xiàng)目用來(lái)實(shí)現(xiàn)SQL層才沧,不過(guò)后來(lái)推翻重做了迈喉,就變成了SparkSQL。這是Spark官方Databricks的項(xiàng)目温圆,Spark項(xiàng)目本身主推的SQL實(shí)現(xiàn)挨摸。Hive On Spark比SparkSQL稍晚。Hive原本是沒(méi)有很好支持MapReduce之外的引擎的岁歉,而Hive On Tez項(xiàng)目讓Hive得以支持和Spark近似的Planning結(jié)構(gòu)(非MapReduce的DAG)得运。所以在此基礎(chǔ)上,Cloudera主導(dǎo)啟動(dòng)了Hive On Spark锅移。這個(gè)項(xiàng)目得到了IBM熔掺,Intel和MapR的支持(但是沒(méi)有Databricks)》校—From SparkSQL與Hive on Spark的比較

Hive on Mapreduce和SparkSQL使用場(chǎng)景

Hive on Mapreduce場(chǎng)景

  • Hive的出現(xiàn)可以讓那些精通SQL技能瞬女、但是不熟悉MapReduce 、編程能力較弱與不擅長(zhǎng)Java語(yǔ)言的用戶(hù)能夠在HDFS大規(guī)模數(shù)據(jù)集上很方便地利用SQL 語(yǔ)言查詢(xún)努潘、匯總诽偷、分析數(shù)據(jù),畢竟精通SQL語(yǔ)言的人要比精通Java語(yǔ)言的多得多
  • Hive適合處理離線非實(shí)時(shí)數(shù)據(jù)

SparkSQL場(chǎng)景

  • Spark既可以運(yùn)行本地local模式疯坤,也可以以Standalone报慕、cluster等多種模式運(yùn)行在Yarn、Mesos上压怠,還可以運(yùn)行在云端例如EC2眠冈。此外,Spark的數(shù)據(jù)來(lái)源非常廣泛菌瘫,可以處理來(lái)自HDFS蜗顽、HBase、 Hive雨让、Cassandra雇盖、Tachyon上的各種類(lèi)型的數(shù)據(jù)。
  • 實(shí)時(shí)性要求或者速度要求較高的場(chǎng)所

Hive on Mapreduce和SparkSQL性能對(duì)比

具體實(shí)驗(yàn)參見(jiàn):Spark SQL & Spark Hive編程開(kāi)發(fā)栖忠, 并和Hive執(zhí)行效率對(duì)比

結(jié)論:sparksql和hive on spark時(shí)間差不多崔挖,但都比hive on mapreduce快很多贸街,官方數(shù)據(jù)認(rèn)為spark會(huì)被傳統(tǒng)mapreduce快10-100倍


更新

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

致謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狸相,一起剝皮案震驚了整個(gè)濱河市薛匪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脓鹃,老刑警劉巖逸尖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異将谊,居然都是意外死亡冷溶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)尊浓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逞频,“玉大人,你說(shuō)我怎么就攤上這事栋齿∶缯停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵瓦堵,是天一觀的道長(zhǎng)基协。 經(jīng)常有香客問(wèn)我,道長(zhǎng)菇用,這世上最難降的妖魔是什么澜驮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮惋鸥,結(jié)果婚禮上杂穷,老公的妹妹穿的比我還像新娘。我一直安慰自己卦绣,他們只是感情好耐量,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著滤港,像睡著了一般廊蜒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溅漾,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天山叮,我揣著相機(jī)與錄音,去河邊找鬼添履。 笑死屁倔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缝龄。 我是一名探鬼主播汰现,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叔壤!你這毒婦竟也來(lái)了瞎饲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炼绘,失蹤者是張志新(化名)和其女友劉穎嗅战,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體俺亮,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驮捍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脚曾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片东且。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖本讥,靈堂內(nèi)的尸體忽然破棺而出珊泳,到底是詐尸還是另有隱情,我是刑警寧澤拷沸,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布色查,位于F島的核電站,受9級(jí)特大地震影響撞芍,放射性物質(zhì)發(fā)生泄漏秧了。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一序无、第九天 我趴在偏房一處隱蔽的房頂上張望验毡。 院中可真熱鬧,春花似錦愉镰、人聲如沸米罚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)录择。三九已至,卻和暖如春碗降,著一層夾襖步出監(jiān)牢的瞬間隘竭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工讼渊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留动看,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓爪幻,卻偏偏與公主長(zhǎng)得像菱皆,于是被迫代替她去往敵國(guó)和親须误。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容