如果你和別人談論大資料,那麼你們很快就會把話題轉到那只黃色的大象身上——Hadoop(它的標誌是一隻黃色大象)。 這個開源的軟體平臺是由Apache基金會發起的,它的價值在於能夠簡便且高效地處理超大型資料。
但是,究竟什麼是 Hadoop呢?簡單地說, Hadoop是一個能夠對大量資料進行分散式處理的軟體框架。 首先,它將大量的資料集保存在分散式伺服器集群中,之後它將在每個伺服器集群裡運行「分散式」資料分析應用。
那Hadoop又有什麼特殊之處呢?首先,它很可靠,即使某一個或某一組伺服器宕機,你的大資料應用程式仍能正常運轉。 其次,它十分高效,在處理過程中,不需要從整個網路來回調取大量資料。
對於Hadoop, Apache給出的官方描述是這樣的:
Apache Hadoop 軟體框架利用簡便的程式設計模型來分散式處理超大資料。 它的設計理念是從一個伺服器擴展到成千上萬的機器,每一個單獨個體都提供本地運算和存儲能力。 與其他依靠硬體確保可靠性的同類軟體平臺不同,Hadoop在應用層自帶bug檢測和處理功能。 因此,它僅僅通過一個電腦集群就可以提供實用性強的服務。
更神奇的是,Hadoop幾乎是模組化的,這意味著你可以用任何其他的軟體工具去替換它的每一個組成部分。 因而,Hadoop 不光是可靠的、高效的,更具有靈活的組織結構。
Hadoop分散式檔案系統(HDFS)
好吧,如果到現在為止你還都搞不懂什麼是Hadoop(其實我覺得也有點抽象),那麼,你只需要記住Hadoop最重要的兩個組成部分就夠了。 一個是它的資料處理框架,另一個是它用於存儲資料的分散式檔案系統(distributed filesystem )。 當然,Hadoop的內部組成相當複雜,不過,只要有了以上兩個組成部分,它就能基本運行了。
這個分散式檔案系統就是我們上面提到的那些分佈的存儲群集。 說白了,它就是Hadoop 中「掌握」著實際資料的那一部分。 雖然Hadoop 可以也使用其它檔案系統進行資料存儲,不過在缺省情況下,它還是會使用這個分散式檔案系統(HDFS)來完成這個「任務」。
打個比方吧,HDFS就好像是一個大水桶,你的資料都可以放在它裡面。 直到你調用它們時,這些「可愛的小傢伙們」都聽話的待在這個安全的大水桶裡。 無論你是想在Hadoop 中進行分析,還是想從Hadoop 中調取資料、用別的工具進行處理,HDFS都能為你提供最流暢、最可靠的運行體驗。
資料處理框架&MapReduce
(譯者注:MapReduce是Google開發的C++程式設計工具,用於大規模資料集的並行運算)
資料處理框架,實際上是與資料協同運行的一個工具。 在缺省情況下,它又被稱MapReduce,是一個基於JAVA的系統。 相比HDFS,你可能更熟悉MapReduce。 造成種情況的原因,可能主要是一下兩個原因:
1.它(MapReduce)是真正處理資料的工具
2.當人們用它資料處理時,感覺都都很爽
在所謂「正常」的關聯式資料庫中,資料的查找和分析,要借助于標準的「結構化查詢語言」(SQL)。 非關聯式資料庫也使用查詢語言,可是不僅限於SQL。 它可以借助于其它查詢語言從資料存儲中調取所需資料。 因而,也有人把這種查詢語言成為「非結構化查需語言」(NoSQL)。
事實上,Hadoop並不是一個資料庫。 雖然它可以説明你存儲資料,並任你隨意調取,可它不涉及任何查詢語言(既不用SQL 也不同其它語言)。 由於它不僅僅是一個資料存儲系統,因而Hadoop需要一個類似于MapReduce的系統,來幫它處理資料。
MapReduce要承擔一系列的工作。 實際上,每一個工作都是一個單獨的JAVA應用,在進入資料庫後,它可以根據需要調出不同的資訊。 用MapReduce代替傳統的查詢語言,可以令資料的查找更加精准、靈活。 不過,在另一方面,這樣做,也增加了資料處理的複雜性。
不過,也有一些工具可以簡化這個過程。 比如,Hadoop還包括一個名為Hive 的應用程式(也是由Apache領導開發的)。 它可以將查詢語言轉化成一個個的MapReduce工作。 過程看似是簡化了,可這種批次處理方式一次只能處理一個工作。 這樣一來,試用Hadoop更像是使用一個資料倉儲,而不是一個資料分析工具。
分散在集群中
Hadoop的另外一個獨特之處就在於,上述的所有功能都是分散式的系統,這和傳統資料庫裡的中央式系統有很大差別。
在一個需要多台機器支撐的資料庫中, 「工作」往往是被分派好了的:所有的資料都存儲在一個或多個機器裡,而資料處理軟體都由另一個或一群伺服器掌控。
而在Hadoop的群組中,HDFS和 MapReduce系統存在於群組中的每一台機器中。 這樣做有兩個好處:一、即使群組中的一台伺服器宕機,整個系統仍然可以正常運行;二、它將資料存儲和資料處理系統放在一起,可以提高資料檢索的速度。
總之,正像我所說的那樣,Hadoop絕對是可靠的、高效的。
當 MapReduce收到一個資訊查詢指令,它就會立即啟動兩個「工具」來進行處理。 一個是「工作追蹤器」(JobTracker),位於Hadoop的主節點上;另一個是「任務追蹤器」(TaskTrackers ),位於Hadoop的每一個網路節點上。
整個處理過程都是線性的:首先,通過運行Map函數,「工作追蹤器」將運算工作分拆成有明確定義的模組,並將其傳送到「任務追蹤器」中(「任務追蹤器」位於存有所需資料的群組機器裡)。 其次,通過運行Reduced函數,同之前定義相對應的精確資料以及從群組中的其它機器找到的所需資料,被傳回到Hadoop群組的中央節點。
HDFS的分佈方式和上面講的方式十分相像。 單一的主節點在群租伺服器中追蹤資料的位置。 主節點也被稱為資料節點,資料就存儲在資料節點中的資料塊上。 HDFS對資料塊進行複製,一般以128MB為一個複製單位,之後將這些複製資料分散到群組裡的每一個節點中。
這種分散式「風格」使Hadoop 具有了另一大優勢:由於它的資料和處理系統都被放在群組中的同一個伺服器中,這樣一來,當你的群組每增加一台機器時,你整個的系統硬體空間和運算能力就都提升了一個等級。
配備你的Hadoop
正如前面我提到的,甚至使用者都沒必要糾結于HDFS或是MapReduce。 因為,Hadoop還提供了「彈性計算雲解決方案」。 這個方案主要是指亞馬遜為其提供的簡易雲存儲服務,以及DataStax公司的開源產品Brisk(基於Apache Cassandra的CassandraFS系統),它代替了HDFS,承擔了Hadoop分散式檔案系統工作。
為了避免MapReduce的「線性「處理方式的局限性,Hadoop還有一個名為Cascading的應用,它可以給開發者提供一個簡便的工具,並且增加工作的靈活性。
客觀地說,目前的Hadoop還不能算是一個完美的、極其簡單的大資料處理工具。 正如我提到的,由於MapReduce在處理資料上的局限性,很多開發者還是習慣于把它僅僅當成一個既簡單又快捷的存儲工具。 這樣一來,Hadoop處理資料的優勢就無法體現。
不過,Hadoop又確實是最好的、用途最廣泛的大資料處理平臺。 尤其是當你沒有時間和金錢去使用關聯式資料庫存儲龐大的資料時。 因而,Hadoop總是在大資料的「屋子」裡放上一頭大象,隨時等著進行資料處理。