Hive on Mapreduce
Hive的原理大家可以參考這篇大數(shù)據(jù)時(shí)代的技術(shù)hive:hive介紹,實(shí)際的一些操作可以看這篇筆記:新手的Hive指南隅肥,至于還有興趣看Hive優(yōu)化方法可以看看我總結(jié)的這篇Hive性能優(yōu)化上的一些總結(jié)
Hive on Mapreduce執(zhí)行流程
執(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)
- 關(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ì)瑰钮。
- 關(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ù)的更新操作有很大不同杈湾。
- 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ù)叫挟。
- 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è)組件
- SQLContext:Spark SQL提供SQLContext封裝Spark中的所有關(guān)系型功能乍构。可以用之前的示例中的現(xiàn)有SparkContext創(chuàng)建SQLContext扛点。
- 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ǔ)句的順序
- 對(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
- 將SQL語(yǔ)句和數(shù)據(jù)庫(kù)的數(shù)據(jù)字典(列灭忠、表、視圖等等)進(jìn)行綁定(Bind)座硕,如果相關(guān)的Projection弛作、Data Source等都是存在的話(huà),就表示這個(gè)SQL語(yǔ)句是可以執(zhí)行的华匾;
- 一般的數(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)蜘拉;
- 計(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 第一次更新,收集和整理