終于有人把 Hadoop 生態(tài)的核心講明白了!
Hadoop是一個(gè)由Apache基金會(huì)開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu)。開發(fā)人員可以在不了解分布式底層細(xì)節(jié)的情況下開發(fā)分布式程序,充分利用集群的威力進(jìn)行高速并行運(yùn)算以及海量數(shù)據(jù)的分布式存儲(chǔ)。Hadoop大數(shù)據(jù)技術(shù)架構(gòu)如圖1所示。
圖1 Hadoop大數(shù)據(jù)技術(shù)架構(gòu)
然而,Hadoop不是一個(gè)孤立的技術(shù),而是一套完整的生態(tài)圈,如圖2所示。在這個(gè)生態(tài)圈中,Hadoop最核心的組件就是分布式文件系統(tǒng)HDFS和分布式計(jì)算框架MapReduce。HDFS為海量的數(shù)據(jù)提供了存儲(chǔ),是整個(gè)大數(shù)據(jù)平臺(tái)的基礎(chǔ),而MapReduce則為海量的數(shù)據(jù)提供了計(jì)算能力。在它們之上有各種大數(shù)據(jù)技術(shù)框架,包括數(shù)據(jù)倉(cāng)庫(kù)Hive、流式計(jì)算Storm、數(shù)據(jù)挖掘工具M(jìn)ahout和分布式數(shù)據(jù)庫(kù)HBase。此外,ZooKeeper為Hadoop集群提供了高可靠運(yùn)行的框架,保證Hadoop集群在部分節(jié)點(diǎn)宕機(jī)的情況下依然可靠運(yùn)行。Sqoop與Flume分別是結(jié)構(gòu)化與非結(jié)構(gòu)化數(shù)據(jù)采集工具,通過(guò)它們可以將海量數(shù)據(jù)抽取到Hadoop平臺(tái)上,進(jìn)行后續(xù)的大數(shù)據(jù)分析。
圖2 Hadoop大數(shù)據(jù)生態(tài)圈
Cloudera與Hortonworks是大數(shù)據(jù)的集成工具,它們將大數(shù)據(jù)技術(shù)的各種組件集成在一起,簡(jiǎn)化安裝、部署等工作,并提供統(tǒng)一的配置、管理、監(jiān)控等功能。Oozie是一個(gè)業(yè)務(wù)編排工具,我們將復(fù)雜的大數(shù)據(jù)處理過(guò)程解耦成一個(gè)個(gè)小腳本,然后用Oozie組織在一起進(jìn)行業(yè)務(wù)編排,定期執(zhí)行與調(diào)度。
01分布式文件系統(tǒng)
過(guò)去,我們用諸如DOS、Windows、Linux、UNIX等許多系統(tǒng)來(lái)在計(jì)算機(jī)上存儲(chǔ)并管理各種文件。與它們不同的是,分布式文件系統(tǒng)是將文件散列地存儲(chǔ)在多個(gè)服務(wù)器上,從而可以并行處理海量數(shù)據(jù)。
Hadoop的分布式文件系統(tǒng)HDFS如圖3所示,它首先將服務(wù)器集群分為名稱節(jié)點(diǎn)(NameNode)與數(shù)據(jù)節(jié)點(diǎn)(DataNode)。名稱節(jié)點(diǎn)是控制節(jié)點(diǎn),當(dāng)需要存儲(chǔ)數(shù)據(jù)時(shí),名稱節(jié)點(diǎn)將很大的數(shù)據(jù)文件拆分成一個(gè)個(gè)大小為128MB的小文件,然后散列存儲(chǔ)在其下的很多數(shù)據(jù)節(jié)點(diǎn)中。當(dāng)Hadoop需要處理這個(gè)數(shù)據(jù)文件時(shí),實(shí)際上就是將其分布到各個(gè)數(shù)據(jù)節(jié)點(diǎn)上進(jìn)行并行處理,使性能得到大幅提升。
圖3 分布式文件系統(tǒng)HDFS
同時(shí),每個(gè)小文件在存儲(chǔ)時(shí),還會(huì)進(jìn)行多節(jié)點(diǎn)復(fù)制(默認(rèn)是3節(jié)點(diǎn)復(fù)制),一方面可以并行讀取數(shù)據(jù),另一方面可以保障數(shù)據(jù)的安全,即任何一個(gè)節(jié)點(diǎn)失效,數(shù)據(jù)都不會(huì)丟失。當(dāng)一個(gè)節(jié)點(diǎn)宕機(jī)時(shí),如果該節(jié)點(diǎn)的數(shù)據(jù)不足3份,就會(huì)立即發(fā)起數(shù)據(jù)復(fù)制,始終保持3節(jié)點(diǎn)的復(fù)制。正因?yàn)榫哂羞@樣高可靠的文件存儲(chǔ),Hadoop的部署不需要備份,也不需要磁盤鏡像,在Hadoop集群的各個(gè)節(jié)點(diǎn)中掛載大容量的磁盤并配置Raid0就可以了。
02分布式計(jì)算框架
Hadoop的另一個(gè)關(guān)鍵組件是分布式計(jì)算框架MapReduce,它將海量數(shù)據(jù)的處理分布到許多數(shù)據(jù)節(jié)點(diǎn)中并行進(jìn)行,從而提高系統(tǒng)的運(yùn)行效率。
MapReduce計(jì)算詞頻的處理過(guò)程如圖4所示。在這個(gè)過(guò)程中,首先輸入要處理的數(shù)據(jù)文件,經(jīng)過(guò)Splitting將其拆分到各個(gè)節(jié)點(diǎn)中,并在這些節(jié)點(diǎn)的本地執(zhí)行Mapping,將其制作成一個(gè)Map。不同的任務(wù)可以設(shè)計(jì)不同的Map。譬如,現(xiàn)在的任務(wù)是計(jì)算詞頻,因此該Map的key是不同的詞,value是1。這樣,在后續(xù)的處理過(guò)程中,將相同詞的1加在一起就是該詞的詞頻了。
圖4 分布式計(jì)算框架MapReduce
Mapping操作執(zhí)行完以后,就開始Shuffling操作。它是整個(gè)執(zhí)行過(guò)程中效率最差的部分,需要在各個(gè)節(jié)點(diǎn)間交換數(shù)據(jù),將同一個(gè)詞的數(shù)據(jù)放到同一個(gè)節(jié)點(diǎn)上。如何有效地降低交換的數(shù)據(jù)量成為優(yōu)化性能的關(guān)鍵。接著,在每個(gè)節(jié)點(diǎn)的本地執(zhí)行Reducing操作,將同一個(gè)詞的這些1加在一起,就得到了詞頻。最后,將分布在各個(gè)節(jié)點(diǎn)的結(jié)果集中到一起,就可以輸出了。
整個(gè)計(jì)算有6個(gè)處理過(guò)程,那么為什么它的名字叫MapReduce呢?因?yàn)槠渌幚磉^(guò)程都被框架封裝了,開發(fā)人員只需要編寫Map和Reduce過(guò)程就能完成各種各樣的數(shù)據(jù)處理。這樣,技術(shù)門檻降低了,大數(shù)據(jù)技術(shù)得以流行起來(lái)。
03優(yōu)缺點(diǎn)
與傳統(tǒng)的數(shù)據(jù)庫(kù)相比,MapReduce分布式計(jì)算雖然有無(wú)與倫比的性能優(yōu)勢(shì),但并不適用于所有場(chǎng)景。MapReduce沒有索引,它的每次計(jì)算都是“暴力全掃描”,即將整個(gè)文件的所有數(shù)據(jù)都掃描一遍。如果要分析的結(jié)果涉及該文件80%以上的數(shù)據(jù),與關(guān)系型數(shù)據(jù)庫(kù)相比,能獲得非常優(yōu)異的性能。如果只是為了查找該文件中的某幾十條記錄,那么它既耗費(fèi)資源,性能也沒有關(guān)系型數(shù)據(jù)庫(kù)好。因此,MapReduce的分布式計(jì)算更適合在后臺(tái)對(duì)批量數(shù)據(jù)進(jìn)行離線計(jì)算,即一次性對(duì)海量數(shù)據(jù)進(jìn)行分析、整理與運(yùn)算。它并不適用于在前臺(tái)面向終端用戶的在線業(yè)務(wù)、事務(wù)處理與隨機(jī)查詢。
同時(shí),MapReduce更適合對(duì)大數(shù)據(jù)文件的處理,而不適合對(duì)海量小文件的處理。因此,當(dāng)要處理海量的用戶文檔、圖片、數(shù)據(jù)文件時(shí),應(yīng)當(dāng)將其整合成一個(gè)大文件(序列文件),然后交給MapReduce處理。唯有這樣才能充分發(fā)揮MapReduce的性能。
本文摘編自《架構(gòu)真意:企業(yè)級(jí)應(yīng)用架構(gòu)設(shè)計(jì)方法論與實(shí)踐》,經(jīng)出版方授權(quán)發(fā)布。