2011年的時候咱們在百度搜索Hadoop相關的問題天天只有零星幾個,2015年再去百度搜索Hadoop已經有800多萬個問題,而現在已然已通過億了,Hadoop已成爲大數據必備的基礎設施了。Hadoop被公認是一套行業大數據標準開源軟件,在分佈式環境下提供了海量數據的處理能力。幾乎全部主流廠商都圍繞Hadoop開發工具、開源軟件、商業化工具和技術服務。近年大型IT公司,如EMC、Microsoft、Intel、Teradata、Cisco都明顯增長了Hadoop方面的投入。那麼到底什麼是Hadoop?它有什麼做用?它的基礎架構是怎麼樣的?今天就Hadoop的這些基本概念來作一次簡單的梳理。node
1、Hadoop是什麼?git
Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構, 是一個存儲系統+計算框架的軟件框架。主要解決海量數據存儲與計算的問題,是大數據技術中的基石。Hadoop以一種可靠、高效、可伸縮的方式進行數據處理,用戶能夠在不瞭解分佈式底層細節的狀況下,開發分佈式程序,用戶能夠輕鬆地在Hadoop上開發和運行處理海量數據的應用程序。github
2、Hadoop能解決什麼問題架構
一、海量數據存儲框架
HDFS有高容錯性的特色,而且設計用來部署在低廉的(low-cost)硬件上;並且它提供高吞吐量(High throughput)來訪問數據,適合那些有着超大數據集(large data set)的應用程序,它由n臺運行着DataNode的機器組成和1臺(另一個standby)運行NameNode進程一塊兒構成。每一個DataNode 管理一部分數據,而後NameNode負責管理整個HDFS 集羣的信息(存儲元數據)。分佈式
二、資源管理,調度和分配工具
Apache Hadoop YARN(Yet Another Resource Negotiator,另外一種資源協調者)是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統和調度平臺,可爲上層應用提供統 一的資源管理和調度,它的引入爲集羣在利用率、資源統一管理和數據共享等方面帶來了巨 大好處。oop
3、Hadoop組件架構是什麼樣的開發工具
看過了Hadoop 的基本介紹以後。咱們來了解HDFS 和 YARN的核心架構和原理,先上HDFS框架圖:大數據
看完上面的圖以後,先來思考幾個問題:
一、元數據信息是什麼,NameNode是如何維護元數據的,元數據信息如何保障一致性?
NameNode維護了HDFS 集羣的元數據信息,包括文件的目錄樹,每一個文件對應的數據塊列表,權限設置,副本數等等。
元數據信息存儲在內存裏,那麼NameNode異常宕機狀況下咋辦?
NameNode對元數據的修改包含兩個部分
內存數據修改
修改內存以後寫一條EditLog
再來看兩個概念 FsImage 和 EditLog:
FsImage:FsImage是NameNode內存中元數據的鏡像文件,是元數據的一個永久性checkpoint,包含了HDFS的全部目錄和文件idnode的序列化信息,能夠類比銀行的帳戶餘額,只有簡單的信息。
EditLog:EditLog是用於銜接內存元數據和FsImage之間的操做日誌,保存了自最後一次檢查點以後,全部針對HDFS文件系統的操做,好比增長文件、重命名文件、刪除目錄等等,能夠類比銀行的帳戶流水,包括每一筆的記錄,若是日積月累,流水信息能夠很是大。
那麼若是Editlog變的很是大以後,宕機以後須要讀取Editlog進行恢復元數據,這是一個很是慢點過程。這個時候該StandbyNameNode 節點上場了。Standby 節點從JournalNode集合拉取Editlog,並定時將Editlog合併成FsImage. FsImage是一份合併以後的存量數據信息。同時將FsImage 上傳到ActiveNode節點。
二、NameNode Active 和 standby 之間是如何切換並始終保持一個ActiveNode?
咱們能夠在上面的HDFS框架圖中看到,連接ZK集羣和NameNode的組件ZKFC
一、ZKFC 監控NameNode的監控狀態
二、ZKFC 利用ZK提供的主備節點選舉來切換
三、通知和修改NameNode的狀態
四、確認元數據同步完成以後對外提供服務
再來看YARN框架圖:
上圖描述了YARN的一個任務的提交和資源分配流程,在整個過程當中涉及到以下的組件:
- ResourceManeger:負責全部資源的監控、分配和管理,並處理客戶端請求,啓動和監控AppMaster,NodeManager
- NodeManager:單個節點上的資源管理和任務管理,處理ResourceManager,AppMaster 的命令
- AppMaster:負責某個具體應用程序的調度和協調,爲應用程序申請資源,並對任務進行監控
- Container:YARN中的一個動態資源分配的概念,其擁有必定的內存,核數。
一個任務提交的總體流程:
(1)Client向YARN中提交應用程序,
其中包括ApplicationMaster程序、命令、用戶程序,資源等。
(2)ResourceManager爲該應用程序分配第一個Container,並與對應的NodeManager通訊,要求它在這個Container中啓動應用程序的ApplicationMaster。
(3)ApplicationMaster首先向ResourceManager註冊,這樣用戶能夠直接經過ResourceManager查看應用程序的運行狀態,而後它將爲各個任務申請資源,並監控它的運行狀態
(4)ApplicationMaster採用輪詢的方式經過RPC協議向ResourceManager申請和領取資源。
(5)一旦ApplicationMaster申請到資源後,便與對應的NodeManager通訊,要求它啓動任務。
(6)NodeManager爲任務設置好運行環境(包括環境變量、Jar包、二進制程序等)後,將任務啓動命令寫到一個腳本中,並經過運行該腳本啓動任務。
(7)各個任務經過某個RPC協議向ApplicationMaster彙報本身的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而能夠在任務失敗時從新啓動任務。在應用程序運行過程當中,用戶可隨時經過RPC向ApplicationMaster查詢應用程序的當前運行狀態。
(8)應用程序運行完成後,ApplicationMaster向ResourceManager註銷並關閉本身。
經過上面的內容,能夠對Hadoop 的一些基本框架有一些簡單的印象了。以後在使用的時候能夠對照上面的結構圖和Hadoop 官網或者社區進行深刻理解。
本文首發於:數棧研習社
咱們在github上有一個開源項目:flinkx,你們歡迎來玩