Hadoop生態體系之簡介
Hadoop 系列(一)基本概念
一、Hadoop 簡介
Hadoop 是一個由 Apache 基金會所開發的分布式系統基礎架構,它可以使用戶在不了解分布式底層細節的情況下開發分布式程序,充分利用集群的威力進行高速運算和存儲。
從其定義就可以發現,它解決了兩大問題:大數據存儲、大數據分析。也就是 Hadoop 的兩大核心:HDFS 和 MapReduce。
-
HDFS(Hadoop Distributed File System)是可擴展、容錯、高性能的分布式文件系統,異步復制,一次寫入多次讀取,主要負責存儲。
-
MapReduce 為分布式計算框架,包含map(映射)和 reduce(歸約)過程,負責在 HDFS 上進行計算。
我們先來了解下 Hadoop 的發展歷史,如圖 1-1 所示。
2002~2004 年,第一輪互聯網泡沫剛剛破滅,很多互聯網從業人員都失業了。我們們的“主角" Doug Cutting 也不例外,他只能寫點技術文章賺點稿費來養家糊口。但是 Doug Cutting 不甘寂寞,懷著對夢想和未來的渴望,與他的好朋友 Mike Cafarella 一起開發出一個開源的搜索引擎 Nutch,並歷時一年把這個系統做到能支持億級網頁的搜索。但是當時的網頁數量遠遠不止這個規模,所以兩人不斷改進,想讓支持的網頁量再多一個數量級。
在 2003 年和 2004 年, Googles 分別公布了 GFS 和 Mapreduce 兩篇論文。 Doug Cutting 和 Mike Cafarella 發現這與他們的想法不盡相同,且更加完美,完全脫離了人工運維的狀態,實現了自動化。
在經過一系列周密考慮和詳細總結後,2006 年, Dog Cutting 放奔創業,隨後幾經周折加入了 yahoo 公司(Nutch 的部分也被正式引入),機綠巧合下,他以自己兒子的一個玩具大象的名字 Hadoop 命名了該項。
當系統進入 Yahoo 以後,項目逐漸發展並成熟了起來。首先是集群規模,從最開始幾十臺機器的規模發展到能支持上千個節點的機器,中間做了很多工程性質的工作;然後是除搜索以外的業務開發, Yahoo 逐步將自己廣告系統的數據挖掘相關工作也遷移到了 Hadoop 上,使 Hadoop 系統進一步成熟化了。
2007 年,紐約時報在 100 個亞馬遜的虛擬機服務器上使用 Hadoop 轉換了 4TB 的圖片數據更加加深了人們對 Hadoope 的印象。
在 2008 年的時侯,一位 Google 的工程師發現要把當時的 Hadoop 放到任意一個集群中去運是一件很困難的事情,所以就與幾個好朋友成立了ー個專門商業化 Hadoop 的公司 Cloudera。同年, Facebook 團隊發現他們很多人不會寫 Hadoop 的程序,而對 SQL 的一套東西很熟,所以他們就在 Hadoop 上構建了一個叫作 Hive 的軟件,專把 SQL 轉換為 Hadoop 的 Mapreduce 程序。
2011年, Yahoo 將 Hadoop 團隊獨立出來,成立了ー個子公司 Hortonworks,專門提供 Hadoop 相關的服務。
說了這麽多,那 Hadoop 有哪些優點呢?
Hadoop 是一個能夠讓用戶輕松架構和使用的分布式計算的平臺。用戶可以輕松地在 Hadoop 發和運行處理海量數據的應用程序。其優點主要有以下幾個:
(1) 高可靠性 : Hadoop 按位存儲和處理數據的能力值得人們信賴。
(2) 高擴展性 : Hadoop 是在可用的計算機集簇間分配數據並完成計算任務的,這些集簇可以方便地擴展到數以幹計的節點中。
(3) 高效性 : Hadoop能夠在節點之間動態地移動數據,並保證各個節點的動態平衡,因此處理速度非常快。
(4) 高容錯性 : Hadoop能夠自動保存數據的多個副本,並且能夠自動將失敗的任務重新分。
(5) 低成本 : 與一體機、商用數據倉庫以及 QlikView、 Yonghong Z- Suites 等數據集市相比,Hadoop 是開源的,項目的軟件成本因此會大大降低。
Hadoop 帶有用 Java 語言編寫的框架,因此運行在 linux 生產平臺上是非常理想的, Hadoop 上的應用程序也可以使用其他語言編寫,比如 C++。
二、Hadoop 存儲 - HDFS
Hadoop 的存儲系統是 HDFS(Hadoop Distributed File System)分布式文件系統,對外部客戶端而言,HDFS 就像一個傳統的分級文件系統,可以進行創建、刪除、移動或重命名文件或文件夾等操作,與 Linux 文件系統類似。
但是,Hadoop HDFS 的架構是基於一組特定的節點構建的(見圖s),這些節稱節點(NameNode,僅一個),它在 HDFS 內部提供元數據服務;第二名稱節點(Secondary NameNode),名稱節點的幫助節點,主要是為了整合元數據操作(註意不是名稱節點的備份);數據節點(DataNode),它為 HDFS 提供存儲塊。由於僅有一個 NameNode,因此這是 HDFS 的一個缺點(單點失敗,在 Hadoop2.x 後有較大改善)。
存儲在 HDFS 中的文件被分成塊,然後這些塊被復制到多個數據節點中(DataNode),這與傳統的 RAID 架構大不相同。塊的大小(通常為 128M)和復制的塊數量在創建文件時由客戶機決定。名稱節點可以控制所有文件操作。HDFS 內部的所有通信都基於標準的 TCP/IP 協議。
關於各個組件的具體描述如下所示:
(1)名稱節點(NameNode)
它是一個通常在HDFS架構中單獨機器上運行的組件,負責管理文件系統名稱空間和控制外部客戶機的訪問。NameNode決定是否將文件映射到DataNode上的復制塊上。對於最常見的3個復制塊,第一個復制塊存儲在同一機架的不同節點上,最後一個復制塊存儲在不同機架的某個節點上。
(2)數據節點(DataNode)
數據節點也是一個通常在HDFS架構中的單獨機器上運行的組件。Hadoop集群包含一個NameNode和大量DataNode。數據節點通常以機架的形式組織,機架通過一個交換機將所有系統連接起來。
數據節點響應來自HDFS客戶機的讀寫請求。它們還響應來自NameNode的創建、刪除和復制塊的命令。名稱節點依賴來自每個數據節點的定期心跳(heartbeat)消息。每條消息都包含一個塊報告,名稱節點可以根據這個報告驗證塊映射和其他文件系統元數據。如果數據節點不能發送心跳消息,名稱節點將采取修復措施,重新復制在該節點上丟失的塊。
(3)第二名稱節點(Secondary NameNode)
第二名稱節點的作用在於為HDFS中的名稱節點提供一個Checkpoint,它只是名稱節點的一個助手節點,這也是它在社區內被認為是Checkpoint Node的原因。
如圖 1-3 所示,只有在NameNode重啟時,edits才會合並到fsimage文件中,從而得到一個文件系統的最新快照。但是在生產環境集群中的NameNode是很少重啟的,這意味著當NameNode運行很長時間後,edits文件會變得很大。而當NameNode宕機時,edits就會丟失很多改動,如何解決這個問題呢?
fsimage 是 NameNode 啟動時對整個文件系統的快照;edits 是在 NameNode 啟動後對文件系統的改動序列。
如圖 1-4 所示,Secondary NameNode 會定時到 NameNode 去獲取名稱節點的 edits,並及時更新到自己 fsimage 上。這樣,如果 NameNode 宕機,我們也可以使用 Secondary-NameNode 的信息來恢復 NameNode。並且,如果 Secondary NameNode 新的 fsimage 文件達到一定閾值,它就會將其拷貝回名稱節點上,這樣 NameNode 在下次重啟時會使用這個新的 fsimage 文件,從而減少重啟的時間。
舉個數據上傳的例子來深入理解下HDFS內部是怎麽做的,如圖 1-5 所示。
文件在客戶端時會被分塊,這裏可以看到文件被分為 5 個塊,分別是:A、B、C、D、E。同時為了負載均衡,所以每個節點有 3 個塊。下面來看看具體步驟:
-
客戶端將要上傳的文件按 128M 的大小分塊。
-
客戶端向名稱節點發送寫數據請求。
-
名稱節點記錄各個 DataNode 信息,並返回可用的 DataNode 列表。
-
客戶端直接向 DataNode 發送分割後的文件塊,發送過程以流式寫入。
-
寫入完成後,DataNode 向 NameNode 發送消息,更新元數據。
這裏需要註意:
-
寫 1T 文件,需要 3T 的存儲,3T 的網絡流量。
-
在執行讀或寫的過程中,NameNode 和 DataNode 通過 HeartBeat 進行保存通信,確定 DataNode 活著。如果發現 DataNode 死掉了,就將死掉的 DataNode 上的數據,放到其他節點去,讀取時,讀其他節點。
-
宕掉一個節點沒關系,還有其他節點可以備份;甚至,宕掉某一個機架也沒關系;其他機架上也有備份。
三、Hadoop 計算 — MapReduce
MapReduce 是 Google 提出的一個軟件架構,用於大規模數據集(大於1TB)的並行運算。概念“Map(映射)”和“Reduce(歸納)”以及它們的主要思想,都是從函數式編程語言借來的,還有從矢量編程語言借來的特性。
當前的軟件實現是指定一個 Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定並發的 Reduce(歸納)函數,用來保證所有映射的鍵值對中的每一個共享相同的鍵組,如圖 1-6 所示。
下面將以 Hadoop 的“Hello World”例程—單詞計數來分析MapReduce的邏輯,如圖 1-7 所示。一般的 MapReduce 程序會經過以下幾個過程:輸入(Input)、輸入分片(Splitting)、Map階段、Shuffle階段、Reduce階段、輸出(Final result)。
-
輸入就不用說了,數據一般放在 HDFS 上面就可以了,而且文件是被分塊的。關於文件塊和文件分片的關系,在輸入分片中說明。
-
輸入分片:在進行 Map 階段之前,MapReduce 框架會根據輸入文件計算輸入分片(split),每個輸入分片會對應一個 Map 任務,輸入分片往往和 HDFS 的塊關系很密切。例如,HDFS 的塊的大小是 128M,如果我們輸入兩個文件,大小分別是 27M、129M,那麽 27M 的文件會作為一個輸入分片(不足 128M 會被當作一個分片),而 129MB 則是兩個輸入分片(129-128=1,不足 128M,所以 1M 也會被當作一個輸入分片),所以,一般來說,一個文件塊會對應一個分片。如圖 1-7 所示,Splitting 對應下面的三個數據應該理解為三個分片。
-
Map 階段:這個階段的處理邏輯其實就是程序員編寫好的 Map 函數,因為一個分片對應一個 Map 任務,並且是對應一個文件塊,所以這裏其實是數據本地化的操作,也就是所謂的移動計算而不是移動數據。如圖 1-7 所示,這裏的操作其實就是把每句話進行分割,然後得到每個單詞,再對每個單詞進行映射,得到單詞和1的鍵值對。
-
Shuffle 階段:這是“奇跡”發生的地方,MapReduce 的核心其實就是 Shuffle。那麽 Shuffle 的原理呢?Shuffle 就是將 Map 的輸出進行整合,然後作為 Reduce 的輸入發送給 Reduce。簡單理解就是把所有 Map 的輸出按照鍵進行排序,並且把相對鍵的鍵值對整合到同一個組中。如圖 1-7 所示,Bear、Car、Deer、River 是排序的,並且 Bear 這個鍵有兩個鍵值對。
-
Reduce 階段:與 Map 類似,這裏也是用戶編寫程序的地方,可以針對分組後的鍵值對進行處理。如圖 1-7 所示,針對同一個鍵 Bear 的所有值進行了一個加法操作,得到 <Bear,2> 這樣的鍵值對。
-
輸出:Reduce 的輸出直接寫入 HDFS 上,同樣這個輸出文件也是分塊的。
說了這麽多,其實 MapReduce 的本質用一張圖可以完整地表現出來,如圖 1-8 所示。
MapReduce 的本質就是把一組鍵值對 <K1,V1> 經過 Map 階段映射成新的鍵值對 <K2,V2>;接著經過 Shuffle/Sort 階段進行排序和“洗牌”,把鍵值對排序,同時把相同的鍵的值整合;最後經過 Reduce 階段,把整合後的鍵值對組進行邏輯處理,輸出到新的鍵值對 <K3,V3>。這樣的一個過程,其實就是 MapReduce 的本質。
Hadoop MapReduce 可以根據其使用的資源管理框架不同,而分為 MR v1 和 YARN/MR v2 版本,如圖 1-9 所示。
在 MR v1 版本中,資源管理主要是 Jobtracker 和 TaskTracker。Jobtracker 主要負責:作業控制(作業分解和狀態監控),主要是 MR 任務以及資源管理;而 TaskTracker 主要是調度 Job 的每一個子任務 task;並且接收 JobTracker 的命令。
在 YARN/MR v2 版本中,YARN 把 JobTracker 的工作分為兩個部分:
-
ResourceManager(資源管理器)全局管理所有應用程序計算資源的分配。
-
ApplicationMaster 負責相應的調度和協調。
NodeManager 是每一臺機器框架的代理,是執行應用程序的容器,監控應用程序的資源(CPU、內存、硬盤、網絡)使用情況,並且向調度器匯報。
四、Hadoop 資源管理 — YARN
在上一節中我們看到,當 MapReduce 發展到 2.x 時就不使用 JobTracker 來作為自己的資源管理框架,而選擇使用 YARN。這裏需要說明的是,如果使用 JobTracker 來作為 Hadoop 集群的資源管理框架的話,那麽除了 MapReduce 任務以外,不能夠運行其他任務。也就是說,如果我們集群的 MapReduce 任務並沒有那麽飽滿的話,集群資源等於是白白浪費的。所以提出了另外的一個資源管理架構 YARN(Yet Another Resource Manager)。這裏需要註意,YARN 不是 JobTracker 的簡單升級,而是“大換血”。同時 Hadoop 2.X 也包含了此架構。Apache Hadoop 2.X 項目包含以下模塊。
-
Hadoop Common:為 Hadoop 其他模塊提供支持的基礎模塊。
-
HDFS:Hadoop:分布式文件系統。
-
YARN:任務分配和集群資源管理框架。
-
MapReduce:並行和可擴展的用於處理大數據的模式。
如圖 1-10 所示,YARN 資源管理框架包括 ResourceManager(資源管理器)、Applica-tionMaster、NodeManager(節點管理器)。各個組件描述如下。
(1)ResourceManager
ResourceManager 是一個全局的資源管理器,負責整個系統的資源管理和分配。它主要由兩個組件構成:調度器(Scheduler)和應用程序管理器(ApplicationManager,AM)。
Scheduler 負責分配最少但滿足 Application 運行所需的資源量給 Application。Scheduler 只是基於資源的使用情況進行調度,並不負責監視/跟蹤 Application 的狀態,當然也不會處理失敗的 Task。
ApplicationManager 負責處理客戶端提交的 Job 以及協商第一個 Container 以供 App-licationMaster 運行,並且在 ApplicationMaster 失敗的時候會重新啟動 ApplicationMaster(YARN 中使用 Resource Container 概念來管理集群的資源,Resource Container 是資源的抽象,每個 Container 包括一定的內存、IO、網絡等資源)。
(2)ApplicationMaster
ApplicatonMaster 是一個框架特殊的庫,每個 Application 有一個 ApplicationMaster,主要管理和監控部署在 YARN 集群上的各種應用。
(3)NodeManager
主要負責啟動 ResourceManager 分配給 ApplicationMaster 的 Container,並且會監視 Container 的運行情況。在啟動 Container 的時候,NodeManager 會設置一些必要的環境變量以及相關文件;當所有準備工作做好後,才會啟動該 Container。啟動後,NodeManager 會周期性地監視該 Container 運行占用的資源情況,若是超過了該 Container 所聲明的資源量,則會 kill 掉該 Container 所代表的進程。
如圖 1-11 所示,該集群上有兩個任務(對應 Node2、Node6 上面的 AM),並且 Node2 上面的任務運行有 4 個 Container 來執行任務;而 Node6 上面的任務則有 2 個 Container 來執行任務。
五、Hadoop 生態系統
如圖 1-12 所示,Hadoop 的生態圈其實就是一群動物在狂歡。我們來看看一些主要的框架。
(1)HBase
HBase(Hadoop Database)是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用 HBase 技術可在廉價 PC Server 上搭建起大規模結構化存儲集群。
(2)Hive
Hive 是建立在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。
(3)Pig
Pig 是一個基於 Hadoop 的大規模數據分析平臺,它提供的 SQL-LIKE 語言叫作 Pig Latin。該語言的編譯器會把類 SQL 的數據分析請求轉換為一系列經過優化處理的 Map-Reduce 運算。
(4)Sqoop
Sqoop 是一款開源的工具,主要用於在 Hadoop(Hive)與傳統的數據庫(MySQL、post-gresql等)間進行數據的傳遞,可以將一個關系型數據庫中的數據導入 Hadoop 的 HDFS 中,也可以將 HDFS 的數據導入關系型數據庫中,如圖 1-13 所示。
(5)Flume
Flume 是 Cloudera 提供的一個高可用、高可靠、分布式的海量日誌采集、聚合和傳輸的系統,Flume 支持在日誌系統中定制各類數據發送方,用於收集數據。同時,Flume 提供對數據進行簡單處理並寫到各種數據接受方(可定制)的能力,如圖 1-14 所示。
(6)Oozie
Oozie 是基於 Hadoop 的調度器,以 XML 的形式寫調度流程,可以調度 Mr、Pig、Hive、shell、jar 任務等。
主要的功能如下。
-
Workflow:順序執行流程節點,支持 fork(分支多個節點)、join(將多個節點合並為一個)。
-
Coordinator:定時觸發 Workflow。
-
Bundle Job:綁定多個 Coordinator。
(7)Chukwa
Chukwa 是一個開源的、用於監控大型分布式系統的數據收集系統。它構建在 Hadoop 的 HDFS 和 MapReduce 框架上,繼承了 Hadoop 的可伸縮性和魯棒性。Chukwa 還包含了一個強大和靈活的工具集,可用於展示、監控和分析已收集的數據。
(8)ZooKeeper
ZooKeeper 是一個開放源碼的分布式應用程序協調服務,是 Google 的 Chubby 一個開源的實現,是 Hadoop 和 Hbase 的重要組件,如圖 1-15 所示。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
(9)Avro
Avro 是一個數據序列化的系統。它可以提供:豐富的數據結構類型、快速可壓縮的二進制數據形式、存儲持久數據的文件容器、遠程過程調用 RPC。
(10)Mahout
Mahout 是 Apache Software Foundation(ASF)旗下的一個開源項目,提供一些可擴展的機器學習領域經典算法的實現,旨在幫助開發人員更加方便快捷地創建智能應用程序。Mahout 包含許多實現,包括聚類、分類、推薦過濾、頻繁子項挖掘。此外,通過使用 Apache Hadoop 庫,可以有效地將 Mahout 擴展到雲中。
Hadoop生態體系之簡介