Hadoop
出自 MBA智库百科(https://wiki.mbalib.com/)
目錄 |
Hadoop,是一個由Apache基金會所開發的分散式系統基礎架構。 用戶可以在不瞭解分散式底層細節的情況下,開發分散式程式。充分利用集群的威力進行高速運算和存儲。
Hadoop實現了一個分散式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬體上;而且它提供高吞吐量(high throughput)來訪問應用程式的數據,適合那些有著超大數據集(large data set)的應用程式。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)文件系統中的數據。
Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的數據提供了存儲,則MapReduce為海量的數據提供了計算。
Hadoop由 Apache Software Foundation 公司於 2005 年秋天作為Lucene的子項目Nutch的一部分正式引入。它受到最先由 Google Lab 開發的 Map/Reduce 和 Google File System(GFS) 的啟發。
2006 年 3 月份,Map/Reduce 和 Nutch Distributed File System (NDFS) 分別被納入稱為 Hadoop 的項目中。
Hadoop 是最受歡迎的在 Internet 上對搜索關鍵字進行內容分類的工具,但它也可以解決許多要求極大伸縮性的問題。例如,如果您要 grep 一個 10TB 的巨型文件,會出現什麼情況?在傳統的系統上,這將需要很長的時間。但是 Hadoop 在設計時就考慮到這些問題,採用並行執行機制,因此能大大提高效率。
Hadoop原本來自於谷歌一款名為MapReduce的編程模型包。谷歌的MapReduce框架可以把一個應用程式分解為許多並行計算指令,跨大量的計算節點運行非常巨大的數據集。使用該框架的一個典型例子就是在網路數據上運行的搜索演算法。Hadoop[3] 最初只與網頁索引有關,迅速發展成為分析大數據的領先平臺。
目前有很多公司開始提供基於Hadoop的商業軟體、支持、服務以及培訓。Cloudera是一家美國的企業軟體公司,該公司在2008年開始提供基於Hadoop的軟體和服務。GoGrid是一家雲計算基礎設施公司,在2012年,該公司與Cloudera合作加速了企業採納基於Hadoop應用的步伐。Dataguise公司是一家數據安全公司,同樣在2012年該公司推出了一款針對Hadoop的數據保護和風險評估。
Hadoop這個名字不是一個縮寫,而是一個虛構的名字。該項目的創建者,Doug Cutting解釋Hadoop的得名 :“這個名字是我孩子給一個棕黃色的大象玩具命名的。我的命名標準就是簡短,容易發音和拼寫,沒有太多的意義,並且不會被用於別處。小孩子恰恰是這方面的高手。”
Hadoop是一個能夠對大量數據進行分散式處理的軟體框架。 Hadoop 以一種可靠、高效、可伸縮的方式進行數據處理。
Hadoop 是可靠的,因為它假設計算元素和存儲會失敗,因此它維護多個工作數據副本,確保能夠針對失敗的節點重新分佈處理。
Hadoop 是高效的,因為它以並行的方式工作,通過並行處理加快處理速度。
Hadoop 還是可伸縮的,能夠處理 PB 級數據。
此外,Hadoop 依賴於社區服務,因此它的成本比較低,任何人都可以使用。
Hadoop是一個能夠讓用戶輕鬆架構和使用的分散式計算平臺。用戶可以輕鬆地在Hadoop上開發和運行處理海量數據的應用程式。它主要有以下幾個優點:
高可靠性。Hadoop按位存儲和處理數據的能力值得人們信賴。
高擴展性。Hadoop是在可用的電腦集簇間分配數據並完成計算任務的,這些集簇可以方便地擴展到數以千計的節點中。
高效性。Hadoop能夠在節點之間動態地移動數據,並保證各個節點的動態平衡,因此處理速度非常快。
高容錯性。Hadoop能夠自動保存數據的多個副本,並且能夠自動將失敗的任務重新分配。
低成本。與一體機、商用數據倉庫以及QlikView、Yonghong Z-Suite等數據集市相比,hadoop是開源的,項目的軟體成本因此會大大降低。
Hadoop帶有用Java語言編寫的框架,因此運行在 Linux 生產平臺上是非常理想的。Hadoop 上的應用程式也可以使用其他語言編寫,比如 C++。
Hadoop得以在大數據處理應用中廣泛應用得益於其自身在數據提取、變形和載入(ETL)方面上的天然優勢。Hadoop的分散式架構,將大數據處理引擎儘可能的靠近存儲,對例如像ETL這樣的批處理操作相對合適,因為類似這樣操作的批處理結果可以直接走向存儲。Hadoop的MapReduce功能實現了將單個任務打碎,並將碎片任務(Map)發送到多個節點上,之後再以單個數據集的形式載入(Reduce)到數據倉庫里
Hadoop 由許多元素構成。其最底部是 Hadoop Distributed File System(HDFS),它存儲 Hadoop 集群中所有存儲節點上的文件。HDFS(對於本文)的上一層是MapReduce 引擎,該引擎由 JobTrackers 和 TaskTrackers 組成。通過對Hadoop分散式計算平臺最核心的分散式文件系統HDFS、MapReduce處理過程,以及數據倉庫工具Hive和分散式資料庫Hbase的介紹,基本涵蓋了Hadoop分散式平臺的所有技術核心。
HDFS
對外部客戶機而言,HDFS就像一個傳統的分級文件系統。可以創建、刪除、移動或重命名文件,等等。但是 HDFS 的架構是基於一組特定的節點構建的(參見圖 1),這是由它自身的特點決定的。這些節點包括 NameNode(僅一個),它在 HDFS 內部提供元數據服務;DataNode,它為 HDFS 提供存儲塊。由於僅存在一個 NameNode,因此這是 HDFS 的一個缺點(單點失敗)。
存儲在 HDFS 中的文件被分成塊,然後將這些塊複製到多個電腦中(DataNode)。這與傳統的 RAID 架構大不相同。塊的大小(通常為 64MB)和複製的塊數量在創建文件時由客戶機決定。NameNode 可以控制所有文件操作。HDFS 內部的所有通信都基於標準的 TCP/IP 協議。
NameNode
NameNode 是一個通常在 HDFS 實例中的單獨機器上運行的軟體。它負責管理文件系統名稱空間和控制外部客戶機的訪問。NameNode 決定是否將文件映射到 DataNode 上的複製塊上。對於最常見的 3 個複製塊,第一個複製塊存儲在同一機架的不同節點上,最後一個複製塊存儲在不同機架的某個節點上。註意,這裡需要您瞭解集群架構。
實際的 I/O事務並沒有經過 NameNode,只有表示 DataNode 和塊的文件映射的元數據經過 NameNode。當外部客戶機發送請求要求創建文件時,NameNode 會以塊標識和該塊的第一個副本的 DataNode IP 地址作為響應。這個 NameNode 還會通知其他將要接收該塊的副本的 DataNode。
NameNode 在一個稱為 FsImage 的文件中存儲所有關於文件系統名稱空間的信息。這個文件和一個包含所有事務的記錄文件(這裡是 EditLog)將存儲在 NameNode 的本地文件系統上。FsImage 和 EditLog 文件也需要複製副本,以防文件損壞或 NameNode 系統丟失。
NameNode本身不可避免地具有SPOF(Single Point Of Failure)單點失效的風險,主備模式並不能解決這個問題,通過Hadoop Non-stop namenode才能實現100% uptime可用時間。
DataNode
DataNode 也是一個通常在 HDFS實例中的單獨機器上運行的軟體。Hadoop 集群包含一個 NameNode 和大量 DataNode。DataNode 通常以機架的形式組織,機架通過一個交換機將所有系統連接起來。Hadoop 的一個假設是:機架內部節點之間的傳輸速度快於機架間節點的傳輸速度。
DataNode 響應來自 HDFS 客戶機的讀寫請求。它們還響應來自 NameNode 的創建、刪除和複製塊的命令。NameNode 依賴來自每個 DataNode 的定期心跳(heartbeat)消息。每條消息都包含一個塊報告,NameNode 可以根據這個報告驗證塊映射和其他文件系統元數據。如果 DataNode 不能發送心跳消息,NameNode 將採取修複措施,重新複製在該節點上丟失的塊。
文件操作
可見,HDFS 並不是一個萬能的文件系統。它的主要目的是支持以流的形式訪問寫入的大型文件。
如果客戶機想將文件寫到 HDFS 上,首先需要將該文件緩存到本地的臨時存儲。如果緩存的數據大於所需的 HDFS 塊大小,創建文件的請求將發送給 NameNode。NameNode 將以 DataNode 標識和目標塊響應客戶機。
同時也通知將要保存文件塊副本的 DataNode。當客戶機開始將臨時文件發送給第一個 DataNode 時,將立即通過管道方式將塊內容轉發給副本 DataNode。客戶機也負責創建保存在相同 HDFS名稱空間中的校驗和(checksum)文件。
在最後的文件塊發送之後,NameNode 將文件創建提交到它的持久化元數據存儲(在 EditLog 和 FsImage 文件)。
Linux 集群
Hadoop 框架可在單一的 Linux 平臺上使用(開發和調試時),官方提供MiniCluster作為單元測試使用,不過使用存放在機架上的商業服務器才能發揮它的力量。這些機架組成一個 Hadoop 集群。它通過集群拓撲知識決定如何在整個集群中分配作業和文件。Hadoop 假定節點可能失敗,因此採用本機方法處理單個電腦甚至所有機架的失敗。
Hadoop和高效能計算、網格計算的區別
在Hadoop 出現之前,高性能計算和網格計算一直是處理大數據問題主要的使用方法和工具,它們主要採用消息傳遞介面(Message Passing Interface,MPI)提供的API 來處理大數據。高性能計算的思想是將計算作業分散到集群機器上,集群計算節點訪問存儲區域網路SAN 構成的共用文件系統獲取數據,這種設計比較適合計算密集型作業。當需要訪問像PB 級別的數據的時候,由於存儲設備網路帶寬的限制,很多集群計算節點只能空閑等待數據。而Hadoop卻不存在這種問題,由於Hadoop 使用專門為分散式計算設計的文件系統HDFS,計算的時候只需要將計算代碼推送到存儲節點上,即可在存儲節點上完成數據本地化計算,Hadoop 中的集群存儲節點也是計算節點。在分散式編程方面,MPI 是屬於比較底層的開發庫,它賦予了程式員極大的控制能力,但是卻要程式員自己控製程序的執行流程,容錯功能,甚至底層的套接字通信、數據分析演算法等底層細節都需要自己編程實現。這種要求無疑對開發分散式程式的程式員提出了較高的要求。相反,Hadoop 的MapReduce 卻是一個高度抽象的並行編程模型,它將分散式並行編程抽象為兩個原語操作,即map 操作和reduce 操作,開發人員只需要簡單地實現相應的介面即可,完全不用考慮底層數據流、容錯、程式的並行執行等細節。這種設計無疑大大降低了開發分散式並行程式的難度。
網格計算通常是指通過現有的互聯網,利用大量來自不同地域、資源異構的電腦空閑的CPU 和磁碟來進行分散式存儲和計算。這些參與計算的電腦具有分處不同地域、資源異構(基於不同平臺,使用不同的硬體體繫結構等)等特征,從而使網格計算和Hadoop 這種基於集群的計算相區別開。Hadoop 集群一般構建在通過高速網路連接的單一數據中心內,集群電腦都具有體繫結構、平臺一致的特點,而網格計算需要在互聯網接入環境下使用,網路帶寬等都沒有保證。
Hadoop 設計之初的目標就定位於高可靠性、高可拓展性、高容錯性和高效性,正是這些設計上與生俱來的優點,才使得Hadoop 一齣現就受到眾多大公司的青睞,同時也引起了研究界的普遍關註。到目前為止,Hadoop 技術在互聯網領域已經得到了廣泛的運用,例如,Yahoo 使用4 000 個節點的Hadoop集群來支持廣告系統和Web 搜索的研究;Facebook 使用1 000 個節點的集群運行Hadoop,存儲日誌數據,支持其上的數據分析和機器學習;百度用Hadoop處理每周200TB 的數據,從而進行搜索日誌分析和網頁數據挖掘工作;中國移動研究院基於Hadoop 開發了“大雲”(Big Cloud)系統,不但用於相關數據分析,還對外提供服務;淘寶的Hadoop 系統用於存儲並處理電子商務交易的相關數據。國內的高校和科研院所基於Hadoop 在數據存儲、資源管理、作業調度、性能優化、系統高可用性和安全性方面進行研究,相關研究成果多以開源形式貢獻給Hadoop 社區。
除了上述大型企業將Hadoop 技術運用在自身的服務中外,一些提供Hadoop 解決方案的商業型公司也紛紛跟進,利用自身技術對Hadoop 進行優化、改進、二次開發等,然後以公司自有產品形式對外提供Hadoop 的商業服務。比較知名的有創辦於2008 年的Cloudera 公司,它是一家專業從事基於ApacheHadoop 的數據管理軟體銷售和服務的公司,它希望充當大數據領域中類似RedHat 在Linux 世界中的角色。該公司基於Apache Hadoop 發行了相應的商業版本Cloudera Enterprise,它還提供Hadoop 相關的支持、咨詢、培訓等服務。在2009 年,Cloudera 聘請了Doug Cutting(Hadoop 的創始人)擔任公司的首席架構師,從而更加加強了Cloudera 公司在Hadoop 生態系統中的影響和地位。最近,Oracle 也表示已經將Cloudera 的Hadoop 發行版和Cloudera Manager 整合到Oracle Big Data Appliance 中。同樣,Intel 也基於Hadoop 發行了自己的版本IDH。從這些可以看出,越來越多的企業將Hadoop 技術作為進入大數據領域的必備技術.
需要說明的是,Hadoop 技術雖然已經被廣泛應用,但是該技術無論在功能上還是在穩定性等方面還有待進一步完善,所以還在不斷開發和不斷升級維護的過程中,新的功能也在不斷地被添加和引入,讀者可以關註Apache Hadoop的官方網站瞭解最新的信息。得益於如此多廠商和開源社區的大力支持,相信在不久的將來,Hadoop 也會像當年的Linux 一樣被廣泛應用於越來越多的領域,從而風靡全球。
MapReduce與Hadoop之比較
Hadoop是Apache軟體基金會發起的一個項目,在大數據分析以及非結構化數據蔓延的背景下,Hadoop受到了前所未有的關註。
Hadoop是一種分散式數據和計算的框架。它很擅長存儲大量的半結構化的數據集。數據可以隨機存放,所以一個磁碟的失敗並不會帶來數據丟失。Hadoop也非常擅長分散式計算——快速地跨多台機器處理大型數據集合。
MapReduce是處理大量半結構化數據集合的編程模型。編程模型是一種處理並結構化特定問題的方式。例如,在一個關係資料庫中,使用一種集合語言執行查詢,如SQL。告訴語言想要的結果,並將它提交給系統來計算出如何產生計算。還可以用更傳統的語言(C++,Java),一步步地來解決問題。這是兩種不同的編程模型,MapReduce就是另外一種。
MapReduce和Hadoop是相互獨立的,實際上又能相互配合工作得很好。
Google的數據中心使用廉價的Linux PC機組成集群,在上面運行各種應用。即使是分散式開發的新手也可以迅速使用Google的基礎設施。核心組件是3個:
1.GFS(Google File System)。一個分散式文件系統,隱藏下層負載均衡,冗餘複製等細節,對上層程式提供一個統一的文件系統API介面。Google根據自己的需求對它進行了特別優化,包括:超大文件的訪問,讀操作比例遠超過寫操作,PC機極易發生故障造成節點失效等。GFS把文件分成64MB的塊,分佈在集群的機器上,使用Linux的文件系統存放。同時每塊文件至少有3份以上的冗餘。中心是一個Master節點,根據文件索引,找尋文件塊。詳見Google的工程師發佈的GFS論文。
2.MapReduce。Google發現大多數分散式運算可以抽象為MapReduce操作。Map是把輸入Input分解成中間的Key/Value對,Reduce把Key/Value合成最終輸出Output。這兩個函數由程式員提供給系統,下層設施把Map和Reduce操作分佈在集群上運行,並把結果存儲在GFS上。
3.BigTable。一個大型的分散式資料庫,這個資料庫不是關係式的資料庫。像它的名字一樣,就是一個巨大的表格,用來存儲結構化的數據。
通過Hadoop安全部署經驗總結,開發出以下十大建議,以確保大型和複雜多樣環境下的數據信息安全。
1、先下手為強!在規劃部署階段就確定數據的隱私保護策略,最好是在將數據放入到Hadoop之前就確定好保護策略。
2、確定哪些數據屬於企業的敏感數據。根據公司的隱私保護政策,以及相關的行業法規和政府規章來綜合確定。
3、及時發現敏感數據是否暴露在外,或者是否導入到Hadoop中。
4、搜集信息並決定是否暴露出安全風險。
5、確定商業分析是否需要訪問真實數據,或者確定是否可以使用這些敏感數據。然後,選擇合適的加密技術。如果有任何疑問,對其進行加密隱藏處理,同時提供最安全的加密技術和靈活的應對策略,以適應未來需求的發展。
6、確保數據保護方案同時採用了隱藏和加密技術,尤其是如果我們需要將敏感數據在Hadoop中保持獨立的話。
7、確保數據保護方案適用於所有的數據文件,以保存在數據彙總中實現數據分析的準確性。
8、確定是否需要為特定的數據集量身定製保護方案,並考慮將Hadoop的目錄分成較小的更為安全的組。
9、確保選擇的加密解決方案可與公司的訪問控制技術互操作,允許不同用戶可以有選擇性地訪問Hadoop集群中的數據。
10、確保需要加密的時候有合適的技術(比如Java、Pig等)可被部署並支持無縫解密和快速訪問數據。