快手一面:講一講 Hadoop、Hive、Spark 之間的關(guān)系?
大家好,我是Tom哥
5G 時(shí)代,運(yùn)營商網(wǎng)絡(luò)不斷提速,成本越來越低,流量越來越便宜。
給 互聯(lián)網(wǎng)、物聯(lián)網(wǎng)、互聯(lián)網(wǎng)+ 各個(gè)行業(yè)的高速發(fā)展創(chuàng)造了非常好的有利條件,同時(shí)也產(chǎn)生了海量數(shù)據(jù)。
如何做好數(shù)據(jù)分析,計(jì)算,提取有價(jià)值信息,大數(shù)據(jù)技術(shù)一直是一個(gè)熱門賽道。
今天我們就對(duì) Hadoop、Hive、Spark 做下分析對(duì)比。
Hadoop
Hadoop 稱為大數(shù)據(jù)技術(shù)的基石。
由兩部分組成,分布式存儲(chǔ)(HDFS)和分布式計(jì)算(MapReduce)。
HDFS 有兩個(gè)關(guān)鍵組件:
1、NameNode
負(fù)責(zé)分布式文件系統(tǒng)的元數(shù)據(jù)(MetaData)管理,如:文件路徑名、數(shù)據(jù)塊的 ID 以及存儲(chǔ)位置等信息,相當(dāng)于操作系統(tǒng)中文件分配表(FAT)的角色。
2、DataNode
負(fù)責(zé)文件數(shù)據(jù)的存儲(chǔ)和讀寫操作,HDFS 將文件數(shù)據(jù)分割成若干數(shù)據(jù)塊(Block),每個(gè) DataNode 存儲(chǔ)一部分?jǐn)?shù)據(jù)塊,從而將一個(gè)大文件分割存儲(chǔ)在整個(gè) HDFS 集群中。
HDFS的高可用設(shè)計(jì):數(shù)據(jù)存儲(chǔ)故障容錯(cuò)、磁盤故障容錯(cuò)、DataNode故障容錯(cuò)、NameNode故障容錯(cuò)。
MapReduce 既是一個(gè)編程模型,又是一個(gè)計(jì)算框架。
包含 Map 和 Reduce 兩個(gè)過程。
計(jì)算過程:
- 首先,將輸入的內(nèi)容轉(zhuǎn)換為 < key , Value > 健值對(duì)。
- 將相同的 key 集中在一起,形成 < key,List >。
- 最后,將 List 進(jìn)行歸約合并,輸出零或多個(gè) < key , Value >。
public void map(Object key, Text value, Context context)
public void reduce(Text key, Iterable<IntWritable> values, Context context )
轉(zhuǎn)換成代碼落地,分別繼承 Mapper 和 Reducer 兩個(gè)類,然后實(shí)現(xiàn)里面的兩個(gè)默認(rèn)方法,完成業(yè)務(wù)邏輯。
所有的復(fù)雜的業(yè)務(wù)全部抽象成 Map 和 Reduce 這兩個(gè)函數(shù)計(jì)算,當(dāng)我們面對(duì)復(fù)雜的具體業(yè)務(wù)功能通過 Map 和 Reduce 的多次 自由組合,從而實(shí)現(xiàn)業(yè)務(wù)邏輯。
當(dāng)然,上面的程序在分布式系統(tǒng)中需要引擎調(diào)度,該計(jì)算框架也稱為 MapReduce。
所以,MapReduce 即是 編程模型,MapReduce 代碼程序,也是調(diào)度分布式計(jì)算的引擎框架。
亮點(diǎn):
- 數(shù)據(jù)不出門,算法滿天跑。每次任務(wù)計(jì)算,只需要將對(duì)應(yīng)的任務(wù)分發(fā)到數(shù)據(jù)所在的服務(wù)器上。避免大數(shù)據(jù)傳輸?shù)男阅軗p耗。
- 引入 shuffle 機(jī)制,將不同服務(wù)器的中間計(jì)算結(jié)果,通過 Partitioner 用 Key 的哈希值對(duì) Reduce 任務(wù)數(shù)取模,分組路由到 Reduce 服務(wù)器上,進(jìn)行合并計(jì)算。
- 框架自帶調(diào)度引擎。
不足:
- 每次 Map 任務(wù)的計(jì)算結(jié)果都會(huì)寫入到本地文件系統(tǒng),速度會(huì)慢些。
- 如果實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)邏輯,通過 Map -- Reduce 的多次自由組合,開發(fā)成本還是有些大。
Tom哥有話說:
Hadoop 作為大數(shù)據(jù)框架的鼻祖,在海量數(shù)據(jù)處理方面確實(shí)讓我們眼前一亮。
但是完美總是需要持續(xù)打磨,Hadoop在處理速度、開發(fā)門檻等方面有很多不足。慢慢的隨著達(dá)爾文進(jìn)化論,市場(chǎng)上開始百花齊放,各種優(yōu)秀的大數(shù)據(jù)框架陸續(xù)出現(xiàn)。
Hive
大數(shù)據(jù)時(shí)代,數(shù)據(jù)分析師崗位非常多,這幫人擅長通過 SQL 來進(jìn)行數(shù)據(jù)分析和統(tǒng)計(jì)。
SQL 方式操控?cái)?shù)據(jù)簡(jiǎn)單、直接,比起 MapReduce代碼 ,大大降低了編程難度,提升了開發(fā)效率。
Hive 通過執(zhí)行引擎 Driver 將數(shù)據(jù)表的信息記錄在 Metastore 元數(shù)據(jù)組件中(包含表名、字段名、字段類型、關(guān)聯(lián)的HDFS文件路徑)。
運(yùn)行過程:
- 通過 Hive 的命令行工具或 JDBC,提交 SQL 語句。
- Driver 將語句提交給編譯器,進(jìn)行 SQL解析、語法分析、語法優(yōu)化等一系列操作,生成函數(shù)的 DAG(有向無環(huán)圖)。
- 根據(jù)執(zhí)行計(jì)劃,生成一個(gè) MapReduce 任務(wù)作業(yè)。
- 最后,提交給 Hadoop MapReduce 計(jì)算框架處理。
Tom哥有話說:
Hive 可以直白理解為 Hadoop 的 API 包裝,采用 SQL 語法實(shí)現(xiàn)業(yè)務(wù),底層依然 Map Reduce 引擎來執(zhí)行,但是轉(zhuǎn)換邏輯被 Hive 作為通用模塊實(shí)現(xiàn)掉了。
我們發(fā)現(xiàn) Hive 本質(zhì)上并沒有什么技術(shù)創(chuàng)新,只是將 數(shù)據(jù)庫 和 MapReduce 兩者有效結(jié)合,但是卻給上層的程序員提供了極大的開發(fā)便利。
雖然,在性能方面沒有質(zhì)的飛躍,但是由于開發(fā)門檻大大降低,在離線批處理占有非常大市場(chǎng)。
Spark
無論是 MapReduce 還是 Hive 在執(zhí)行速度上其實(shí)是很慢的,但是沒有比較就沒有傷害,直到 Spark 框架的橫空出現(xiàn),人們的意識(shí)也發(fā)生了重大改變。
Spark 將大數(shù)據(jù)集合抽象成一個(gè) RDD 對(duì)象,然后提供了 轉(zhuǎn)換、動(dòng)作 兩大類算子函數(shù),對(duì)RDD進(jìn)行處理,并得到一個(gè)新的 RDD,然后繼續(xù)后續(xù)迭代計(jì)算,像 Stream 流一樣依次執(zhí)行,直到任務(wù)結(jié)束。內(nèi)部也是采用分片處理,每個(gè)分片都會(huì)分配一個(gè)執(zhí)行線程。
傳統(tǒng)的面向?qū)ο缶幊趟悸罚?/h4>
將一個(gè)數(shù)據(jù)集合作為入?yún)鬟f給一個(gè)函數(shù)方法,經(jīng)過運(yùn)算,返回一個(gè)新的數(shù)據(jù)集合。然后將這個(gè)新的數(shù)據(jù)集合作為入?yún)鬟f給下一個(gè)函數(shù)方法,直到最后計(jì)算完成,輸出結(jié)果。
如果這個(gè)數(shù)據(jù)集有 1億條,總共兩次函數(shù)運(yùn)算,每一個(gè)函數(shù)運(yùn)算,都要遍歷1億次,那么總的時(shí)間復(fù)雜度是 2億次。
函數(shù)式編程思路:
將數(shù)據(jù)集合轉(zhuǎn)換成流,每個(gè)元素依次經(jīng)過上面兩個(gè)函數(shù)處理,最后得到一個(gè)新的結(jié)果集合。整個(gè)流程只需要遍歷一趟,那么總的時(shí)間復(fù)雜度是 1億次。
面對(duì)海量的數(shù)據(jù)以及較多的算子組合運(yùn)算,這種性能累計(jì)提升還是非常明顯的。
Spark 的一些亮點(diǎn):
引入惰性計(jì)算,只有當(dāng)開發(fā)者調(diào)用了 Actions 算子,之前的轉(zhuǎn)換算子才會(huì)執(zhí)行。
以 shuffle 為邊界,將 DAG 切分多個(gè)階段,一個(gè)階段里的多個(gè)算子(如:textFile、flatMap、map)可以合并成一個(gè)任務(wù),然后采用上面的函數(shù)編程思想處理數(shù)據(jù)分片。
使用 內(nèi)存 存儲(chǔ)中間計(jì)算結(jié)果:
借助這些亮點(diǎn)優(yōu)化,Spark 比 MapReduce 運(yùn)行速度快很多。上圖是邏輯回歸機(jī)器學(xué)習(xí)算法的運(yùn)行時(shí)間比較 ,Spark 比 MapReduce 快 100 多倍。
當(dāng)然Spark 為了保留 Hive 的SQL優(yōu)勢(shì),也推出了 Spark SQL,將 SQL 語句解析成 Spark 的執(zhí)行計(jì)劃,在 Spark 上執(zhí)行。
Tom哥有話說:
Spark 像個(gè)孫猴子一樣橫空出世,也是有先天條件的。Hadoop 早期受內(nèi)存容量和成本制約很大,但隨著科技進(jìn)步,到了Spark時(shí)期內(nèi)存條件已經(jīng)具備,架構(gòu)思路也可以直接按照內(nèi)存的玩法標(biāo)準(zhǔn)來設(shè)計(jì)。
有時(shí)候就是這樣,趕上一個(gè)好時(shí)候,豬都能飛上天。要想成功,天時(shí)地利人和,缺一不可。