深入淺出的Hadoop基礎(chǔ)原理(一)

起源

做搜索是技術(shù)難度很高的活。首先要存儲(chǔ)很多的數(shù)據(jù),要把全球的大部分網(wǎng)頁都抓下來,可想而知存儲(chǔ)量有多大。然后,要能快速檢索網(wǎng)頁,用戶輸入幾個(gè)關(guān)鍵詞找資料,越快越好,最好在一秒之內(nèi)出結(jié)果。如果全球每秒有上億個(gè)用戶在檢索,只有一兩秒的檢索時(shí)間,要在全球的網(wǎng)頁里找到最合適的檢索結(jié)果,難度很大。

Google 用三個(gè)最重要的核心技術(shù)解決上述問題,它們分別是 GFS、 MapReduceBigTable。Google 發(fā)表了它們的設(shè)計(jì)論文,但沒有將它們開源,核心競(jìng)爭(zhēng)力不可能開源的。論文發(fā)表之后,Doug Cutting 等人根據(jù)論文的思想,在開源項(xiàng)目 Nutch 的基礎(chǔ)上實(shí)現(xiàn)了 Hadoop。后來,Doug Cutting 去了Yahoo,繼續(xù)做 Hadoop。后來,Hadoop 的開發(fā)和應(yīng)用開始爆發(fā)了。

在對(duì)應(yīng)關(guān)系上看,Hadoop MapReduce 對(duì)應(yīng) MapReduce,Hadoop Distributed File System (HDFS)對(duì)應(yīng) GFS,HBase對(duì)應(yīng) BigTable。一般我們所說的Hadoop 其實(shí)是指 Hadoop 體系,它包括 Hadoop MapReduce、HDFS、HBase,還有其他更多的技術(shù)

工作原理

先用一種有助于理解的方式描述 MapReduce 和 HDFS 是如何工作的。假如有1000G 的多個(gè)文本文件,內(nèi)容是英文網(wǎng)頁,需要統(tǒng)計(jì)詞頻,也就是哪些單詞出現(xiàn)過,各出現(xiàn)過多少次,有 1000 臺(tái)計(jì)算機(jī)可供使用,要求速度越快越好。

最直接的想法是,把 1000G 的文件分成 1000 份,每臺(tái)機(jī)器處理 1G 數(shù)據(jù)。處理完之后,其他 999 臺(tái)機(jī)器將處理結(jié)果發(fā)送到一臺(tái)固定的機(jī)器上,由這臺(tái)機(jī)器進(jìn)行合并然后輸出結(jié)果。

Hadoop 將這個(gè)過程進(jìn)行自動(dòng)化的處理。首先看如何存儲(chǔ)這1000G 的文本文件。HDFS在這1000臺(tái)機(jī)器上創(chuàng)建分布式文件系統(tǒng),將 1000G 的文件切分成若干個(gè)固定大小的文件塊,每個(gè)塊一般是 64M 大小,分散存儲(chǔ)在這 1000 臺(tái)機(jī)器上。這么多機(jī)器,在運(yùn)行的時(shí)候難免會(huì)出現(xiàn)有幾臺(tái)突然死機(jī)或者掛掉的情況,這導(dǎo)致上面存儲(chǔ)的文件塊丟失,會(huì)導(dǎo)致計(jì)算出錯(cuò)。為避免這種情況,HDFS 對(duì)每個(gè)文件塊都做復(fù)制,復(fù)制成 3~5 個(gè)相同的塊,放到不同的機(jī)器上,這樣死機(jī)的文件塊在其他機(jī)器上仍然可以找得到,不影響計(jì)算。

MapReduce 其實(shí)是兩部分,先是 Map 過程,然后是 Reduce 過程。從詞頻計(jì)算來說,假設(shè)某個(gè)文件塊里的一行文”字是“ This is a small cat. That is a small dog.”,那么,Map 過程會(huì)對(duì)這一行進(jìn)行處理,將每個(gè)單詞從句子解析出來,依次生成形如<“this”, 1>, <”is”, 1>, <”a”, 1>, <”small”, 1>, <”cat”, 1>, <”that”, 1>, <”is”, 1>, <”a”, 1>, <”small”, 1>,<”dog”, 1>的鍵值對(duì),<”this”, 1> “ 表示 this”這個(gè)單詞出現(xiàn)了 1次,在每個(gè)鍵值對(duì)里,單詞出現(xiàn)的次數(shù)都是 1 次,允許有相同的鍵值對(duì)多次出現(xiàn),比如<”is”,1>這個(gè)鍵值對(duì)出現(xiàn)了 2 次。Reduce 過程就是合并同類項(xiàng),將上述產(chǎn)生的相同的鍵值對(duì)合并起來,將這些單詞出現(xiàn)的次數(shù)累加起來,計(jì)算結(jié)果就是<“this”, 1>, <”is”, 2>, <”a”, 2>, <”small”, 2>,<”cat”, 1>, <”that”, 1>, <”dog”, 1>。

這種方式很簡(jiǎn)潔,并且可以進(jìn)行多種形式的優(yōu)化。比如說,在一個(gè)機(jī)器上,對(duì)本地存儲(chǔ)的 1G 的文件塊先 Map,然后再 Reduce,那么就得到了這 1G 的詞頻統(tǒng)計(jì)結(jié)果,然后再將這個(gè)結(jié)果傳送到遠(yuǎn)程機(jī)器,跟其他 999 臺(tái)機(jī)器的統(tǒng)計(jì)結(jié)果再次進(jìn)行 Reduce,就得到 1000G 文件的全部詞頻統(tǒng)計(jì)結(jié)果。如果文件沒有那么大,只有三四個(gè)G,就不需要在本地進(jìn)行Reduce 了,每次 Map 之后直接將結(jié)果傳送到遠(yuǎn)程機(jī)器做 Reduce。

具體地,如果用Hadoop 來做詞頻統(tǒng)計(jì),流程是這樣的:

1) 先用HDFS的命令行工具,將1000G 的文件復(fù)制到 HDFS 上;

2) 用Java 寫MapReduce 代碼,寫完后調(diào)試編譯,然后打包成 Jar 包;

3) 執(zhí)行Hadoop 命令,用這個(gè) Jar 包在 Hadoop 集群上處理 1000G 的文件,然后將結(jié)果文件存放到指定的目錄。

4) 用HDFS的命令行工具查看處理結(jié)果文件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容