五分鐘零基礎搞懂Hadoop
「大數據」,想必大家經常聽到這個被炒得很熱的話題。隨之而來的是各種看似高大上的專業術語,比如「擴展性」、「可靠性」、「容錯性」,好像真的很高深,要積累多年經驗才能學習。
但另一方面,很多同學都剛剛進入互聯網這個行業,對分散式計算還沒有很多了解,那是不是就要花很多力氣才能搞懂「大數據」呢?不必擔心,包子老師在這裡用淺顯易懂深入淺出的語言,幫助沒有基礎的同學快速的入手「大數據」,讓每位同學都能迅速學會最前沿的技術。今天,我們先學習當前使用最廣泛的大數據處理框架 Hadoop.
Hadoop,你是怎麼來的?
今天的社會產生越來越多的數據,比如:你登錄Facebook以後點擊了哪些好友,你在Amazon上瀏覽了哪些產品,你在linkedin上瀏覽了哪些公司,甚至到從石油礦井裡的鑽頭收集了哪些地質信息。
我們還發現,通過分析這些數據總結規律,我們可以讓Facebook和Amazon顯示讓用戶更感興趣的廣告,公司HR會更準確找到合適的求職者,石油公司也能用更低的成本開採更多的石油。
那找個軟工寫演算法不就行了嗎?
確實,這些決策都是通過演算法找到規律的。可問題是現在的數據量太大了,一台機器要完成一個問題要算好久好久。
那用多台機器處理不就行了嗎?
確實,Hadoop以及其他任何大數據框架都是多台機器共同處理的。可問題是,這些演算法都要完成一個特定的問題,給出一個答案,多台機器不能自己算自己的,他們要有不同的分工,聯合起來共同算完這個問題。這裡就是Hadoop等框架的特長。
我們舉個例子吧:
Google是大家常用的搜索引擎,作為業務的重要特徵,它自然想知道大家對哪些關鍵字感興趣,比如以天為單位,收集所有人搜過的關鍵字,統計其出現的次數。
這聽起來像個哈希表就能幹的問題對吧?可是,每天那麼多人使用Google,它不可能把這些關鍵字都放在內存里,而且Google也是用很多伺服器為大家完成搜索的,所以一天里所有搜過的關鍵字,都以文件的形式存在多台機器上。我們就叫這些機器1, 2, 3......n.
比如在機器1上存儲了一個文件,內容是所有搜過的關鍵字:Deer, Bear, River …...
圖1
既然Log文件存放在多台機器中,那如何計算關鍵字出現的總次數呢?
一種直觀的演算法,就是先讓每台機器統計本機上每個關鍵字的搜索次數,寫段演算法統計一個文件里的關鍵字很簡單。比如機器1的處理結果為:
Deer t150000
River t110000
Car t 100000
…
(參見圖1的mapping)
注意到這裡,每台機器知道的是本機上關鍵字的搜索次數,而我們關心的是所有機器上的關鍵字的搜索總次數。
那下一步再找一組機器,不妨稱其為:A, B, C, D......
每台機器只統計一部分關鍵字出現在所有機器上的總次數,比如:
讓機器A統計 在機器1, 2, 3.......n上「Bear」出現的總次數;
讓機器B統計,在機器1, 2, 3.......n上「Car」出現的總次數;
讓機器C統計,在機器1, 2, 3.......n上「Deer」出現的總次數;
讓機器D統計,在機器1, 2, 3......n上「River」出現的總次數;
(參見圖1的reducing)
這樣,當A, B, C, D......完成自己的任務以後,我們就知道每個關鍵字在過去一天出現的次數了。
所以每台機器不但要計算自己的任務,還要和其他機器「合作」,在我們剛才的例子里就是機器A, B, C, D......要從機器1, 2, 3, 4......那裡知道關鍵字的出現次數,而且,A, B, C, D.....還要溝通好,分別統計不同的關鍵字,即不能兩台機器都統計同一個關鍵字,也不能有的關鍵字沒有機器統計。
好吧,大數據計算真複雜,那我們什麼時候說說Hadoop?
其實,如果你明白了剛才的例子,你就明白Hadoop了!
啊?真的么?
是的,我們剛才計算搜索引擎關鍵字出現次數的例子,就是一個使用Hadoop的經典案例。像我們剛才說的,大數據計算非常複雜,各個機器之間要協調工作。但是,當總結常用的大數據演算法後,我們發現他們有一定的共同點(稍後介紹),很多演算法都要做一些類似的工作。既然有共同點,我們就沒有必要重造輪子。這些類似的工作可以做成Framework,以後再開發類似大數據分析軟體可以重用這些Framework的功能。Hadoop就是這樣一個Framework,它來源於Google一篇關於MapReduce的Paper.
那Hadoop總結了演算法的哪些共同點呢?
那篇MapReduce Paper的作者發現,很多計算,就比如我們剛才的例子,都可以拆分成Map, Shuffle, Reduce三個階段:
Map階段中,每台機器先處理本機上的數據,像圖1中各個機器計算本機的文件中關鍵字的個數。
各個機器處理完自己的數據後,我們再把他們的結果匯總,這就是Shuffle階段,像剛才的例子,機器A, B, C, D......從1-n所有機器上取出Map的結果,並按關鍵字組合。
最後,進行最後一步處理,這就是Reduce,我們剛才的例子中就是對每一個搜索關鍵字統計出現總次數。
這幾步我們就稱為MapReduce Model.
圖2
為了完成MapReduce Model的計算,實際開發的軟體需要一些輔助的功能。想像一下,起始時的一組機器上面存儲了要處理的數據,但是Map, Shuffle, Reduce階段的Function在哪兒呢?所以我們需要把Mapper Function, Reducer Function (Java code或者其他語言的code) 安裝在機器 1-n 和A-Z上,並且執行。而且在Map階段以後,計算結果保存在本機上,沒辦法Shuffle到Reduce的機器上。所以,也需要有軟體按照Shuffle演算法,把Mapper Function的結果搬運到Reduce階段的機器上。
運行整個Hadoop Job的流程中,很多工作對於所有演算法都是需要的,不同的演算法只是Mapper Function和Reducer Function. 換句話說,Hadoop實現了通用的功能,開發人員只需要告訴Hadoop需要執行的Mapper, Reducer Function,就可以完成想要的計算,而不需要開發所有步驟。
恭喜你,看到這裡,你已經掌握了Hadoop的精髓。在這個系列之後的文章中,我們還會向大家介紹,Hadoop更多隱含的、但必不可少的功能,以及更多的重要的大數據Framework,比如HDFS,Hbase,Spark等。希望大家持續關注我們,我們會讓大家用最少的時間,掌握最前沿的技術!
推薦閱讀:
※Hadoop mapreduce的核心組件
※大數據2016年大事記
※《Machine Learning:Clustering & Retrieval》課程第3章KMeans之並行化