Apache Hadoop(1)---概述
早在上古時代(那時候我大概正在讀小學吧),大資料這個詞還沒那麼火,業界對於海量資料的儲存和處理相對來說比較粗糙,還在追求容量更大的硬碟、效能更強的伺服器。當然了,分散式處理是有的,那時候應該是叫 網格計算
吧,就是很多的節點,然後儲存是集中存放,通過SAN(storage area network)掛載到每一個計算節點上,各個節點之間通過MPI(Message Passing Interface)進行通訊。
MPI 可以解決大規模的資料處理任務,但是它有著很多缺點,開發者需要自己去考慮節點間通訊、節點故障檢測與處理等容錯、任務劃分等等很細節的東西,利用MPI來處理大規模資料,可能大部分時間不是在對資料本身進行分析和處理,而是在解決層出不窮的bug。對於SAN來說,儘管有raid機制可以提升儲存的可靠性,但是它沒有解決節點故障帶來的資料丟失問題,以及很難應付更大規模的資料儲存問題,網路吞吐也往往容易成為瓶頸。
對於大資料處理,我們首先要能夠儲存如此大規模的資料量,其次是如何對這海量的資料進行處理,再然後是儘可能快的處理。
2003年開始Google發出的三篇論文 Google File System
、 MapReduce
、 BigTable
給大資料領域帶來了曙光,分別解決了大資料儲存、大資料處理,以及高效的結構化大資料存取,這三篇論文算是奠定了現代大資料處理的基石,說它是現代大資料處理的鼻祖也不為過。
誕生
不過Google並不熱衷於開源(畢竟人家的工程師吊打一切,根本看不上社群的力量),只是給出了具體的設計和思路,所以當時大家也只能望梅止渴了。(現在Google也算是積極擁抱開源吧,推出了 Tensorflow
、 Kubernetes
等等powerful的專案,不過這是後話了)
儘管Google並沒有開原始碼,但是論文寫的很詳細,足夠讓外人按圖索驥了。Nutch(一個搜尋引擎,搜尋引擎對於大資料處理的需求很強)的工程師 Doug Cutting 在看到這幾篇論文之後開始按照論文裡的設計思路來重構自己的系統,他們成功的將Hadoop部署到了數十臺節點上並穩定的執行。
後來,負責人跳槽到了Yahoo!,領導一個獨立的團隊專門開發Hadoop系統,叢集規模也開始擴大到數百個節點,並且剝離了與業務強相關的內容,逐漸成為一個通用系統。
在2008年,Hadoop成為了apache基金會的頂級開源專案,世人得以一睹Hadoop的強大,同時開源社群也逐漸成長。同年,Hadoop用時209秒完成了1T資料的排序任務,打破了當時的記錄,並且隨著不斷調優,處理時間越來越短,資料量也越來越大。
蓬勃發展
相比較於MPI,Hadoop 具有可靠的大資料儲存,通過冗餘、容錯等機制,即便是普通的伺服器也能夠很好的執行大資料處理任務。同時,Hadoop自帶的task容錯機制也使得使用者能夠專心資料分析任務,很少需要去關注容錯。此外,MapReduce也大大簡化了資料處理的複雜性,簡化操作的同時也帶來了可靠性。
學術界和業界都開始向Hadoop轉移,貢獻了很多的新功能、優化細節、bug修復,並以Hadoop為基礎推出了更多的大資料處理平臺,如列式儲存HBase、資料倉庫Hive等等,一些傳統的單機演算法也開始通過Hadoop走向分散式(那大概是大資料方向最好水論文的時代吧)。
Hadoop 1 版本中資源分配與任務排程框架是跟mapredice等緊耦合的,隨著Hadoop的成熟,在2.0版本時,這一套被獨立出來,成為了一個通用的排程框架(YARN)供其他大資料平臺使用,如Spark就支援使用YARN來做資源分配和任務排程。
老當益壯
從 2003 年到現在已經經過了16年的時光,在計算機這個飛速發展的領域,16年足以讓一門技術從呱呱墜地到流行再到逐步淘汰的過程了。這麼算的話,Hadoop現在也算是垂垂老矣,雖然Hadoop的熱度減少,風頭都被 Spark
、 Flink
等等後來者搶去了,但是依舊沒有淡出人們的視線。一方面,雖然現在有了更加快、更加好用的工具,但是他們底層大多仍然依賴HDFS(一部分原因是足夠好用,另一個是企業的資料遷移不便);另一方面,Hadoop也還遠沒有到被淘汰的地位,仍然有很多的任務用Hadoop執行,也一直在隨著需求變遷而進步。我們實驗室年初的一篇A會論文的實驗就是在Hadoop上跑的( BENU: Distributed Subgraph Enumeration with Backtracking-based Framework )。
如果要說說Hadoop的不足之處,恐怕又能寫滿整整一張A4紙了:它的程式設計模型太過簡單難以實現複雜需求、HDFS對小檔案的處理能力太差、map和reduce的頻繁落盤操作帶來了很大的效能損失、namenode雖然支援HA但是依舊是瓶頸、基於批處理的模式使得延遲非常高、對於迭代型任務支援不好等等等等。但是Hadoop依舊有著很高的可用性,基於HDFS構建的HBase列式儲存能夠提供毫秒級的響應而且拓展能力很強。
現在我們說Hadoop,不僅僅是在只MapReduce、YARN這些東西,更多的是在指這個生態,從Hadoop誕生以來,有太多的元件/系統在此之上被構建,它的設計理念仍然會被新的系統所參考、借鑑。
總結
作為一個劃時代的系統,Hadoop將大資料處理帶上了一個新的高度。不再需要追擊極致的單機效能,它的容錯機制使得普通伺服器就能提供可靠的服務;不再需要考慮那麼多的節點協調、容錯,使用者只需要通過簡單的介面就能完成海量資料的儲存和處理工作,就像是在單機上處理這些任務一樣,不需要去考慮太多的硬體故障、網路故障等;針對日益膨脹的資料,只需要簡單的增加節點就可以,系統性能可以接近水平拓展。