一、 簡介
Hadoop主要在分布式環境下集群機器,獲取海量數據的處理能力,實現分布式集群下的大數據存儲和計算。
其中三大核心組件:?HDFS存儲分布式文件存儲、YARN分布式資源管理、MapReduce分布式計算。
二、工作原理
2.1 HDFS集群
Web訪問地址:http://hadoop1:9870
HDFS由NameNode(主節點)、SecondaryNameNode(輔助節點)、DataNode(從節點)構成,
其中NameNode負責管理整個HDFS集群,SecondaryNameNode輔助NameNode管理元數據,DataNode負責存儲實際的數據塊(一個block塊默認大小128MB)和對數據塊的讀、寫操作。
?
2.1.1 block數據塊
- 基本存儲單位(一般64M)
- 一個大文件會被拆分成多個block塊,然后存儲到不通機器上
- 每塊會備份到其他機器上,保證數據安全性,防止數據丟失(默認備份3份)。
2.1.2 NameNode
- 管理文件系統命名空間和客戶端對文件訪問
- 保存文件具體信息(文件信息、文件拆分block塊信息、以及block和DataNode的信息)
- 接收用戶請求
2.1.3 DataNode
- 保存具體的block數據
- 負責數據的讀寫操作和復制操作
- 向NameNode報告當前存儲或者修改的數據信息
- DataNode之間進行相互通信,復制數據塊
2.1.4 Secondary NameNode
- 定時與NameNode進行同步(合并fsimage和edits文件)
- 當NameNode失效時,需要手工將其設置成主機
2.1.5 文件寫入步驟
? ? 1. Client(客戶端)請求namenode保存文件。
? ? 2. NameNode接收到客戶端請求后, 會校驗客戶端針對該文件是否有寫的權利,文件是否存在,校驗通過后告知客戶端可以上傳。
? ? 3. 接收到可以上傳的指令后, 客戶端會按照128MB(默認)對文件進行切塊。
? ? 4. Client(客戶端)再次請求namenode, 第1個Block塊的上傳位置。
? ? 5. namenode會根據副本機制, 負載均衡, 機架感知原理及網絡拓撲圖, 返回給客戶端存儲該Block塊的DataNode列表。
? ? ? ? 例如: node1, node2, node3;
? ? 6. Client(客戶端)會先連接就近的datanode機器, 然后依次和其他的datanode進行連接, 形成傳輸管道(Pipeline);
? ? 7. 采用數據報包(DataPacket)的形式傳輸數據, 每個包的大小不超過64KB, 并建立反向應答機制(ACK機制);
? ? 8. 具體的上傳動作: node1 -> node2 -> node3, ?ACK反向應答機制: node3 => node2 => node1。
? ? 9. 重復上述的步驟, 直至第1個Block塊上傳完畢。
? ?10. 第一個Bloc上傳完畢客戶端(Client)重新請求第二個Block的上傳位置, 重復上述動作, 直至所有的Block塊傳輸完畢。
至此, HDFS寫數據流程結束。
?
2.1.6 文件讀取步驟
?1. Client(客戶端)請求namenode, 讀取文件。
?2. NameNode校驗該客戶端是否有讀權限, 及該文件是否存在, 校驗成功后, 會返回給客戶端該文件的塊信息。
? ? ? ? 例如:
? ? ? ? ? ? block1: node1, node2, node5
? ? ? ? ? ? block2: node3, node6, node8
? ? ? ? ? ? block3: node2, node5, node6 ? ? 這些地址都是鮮活的;
? ? ? ? ? ? ......
? ? 3. Client(客戶端)會連接上述的機器(節點), 并行的從中讀取塊的數據。
? ? 4. Client(客戶端)讀取完畢后, 會循環NameNode獲取剩下所有的(或者部分的塊信息), 并行讀取, 直至所有數據讀取完畢。
? ? 5. Client(客戶端)根據Block塊編號, 把多個Block塊數據合并成最終文件即可。
?
2.1.7 數據備份
- NameNode負責管理block塊的復制,它周期性地接收集群中所有DataNode的心跳數據包和Blockreport。心跳包表示DataNode正常工作,Blockreport描述了該DataNode上所有的block組成的列表。
- HDFS采用一種稱為rack-aware的策略來決定備份數據的存放。通過一個稱為Rack Awareness的過程,NameNode決定每個DataNode所屬rack id。缺省情況下,一個block塊會有三個備份,一個在NameNode指定的DataNode上,一個在指定DataNode非同一rack的DataNode上,一個在指定DataNode同一rack的DataNode上。這種策略綜合考慮了同一rack失效、以及不同rack之間數據復制性能問題。
- 為了降低整體的帶寬消耗和讀取延時,HDFS會盡量讀取最近的副本。如果在同一個rack上有一個副本,那么就讀該副本。如果一個HDFS集群跨越多個數據中心,那么將首先嘗試讀本地數據中心的副本。
2.1.8 HDFS工作原理
1、NameNode初始化時會產生一個edits文件和一個fsimage文件。
2、隨著edits文件不斷增大,當達到設定的閥值時(1個小時或寫入100萬次),SecondaryNameNode把edits文件和fsImage文件復制到本地,同時NameNode會產生一個新的edits文件替換掉舊的edits文件,這樣以保證數據不會出現冗余。
3、SecondaryNameNode拿到這兩個文件后,會在內存中進行合并成一個fsImage.ckpt的文件(這個過程稱為checkpoint),合并完成后,再將fsImage.ckpt文件推送給NameNode。
4、NameNode文件拿到fsImage.ckpt文件后,會將舊的fsimage文件替換掉(并不會立刻替換,而是達到一定閾值后被替換掉),并且改名成fsimage文件。
通過以上幾步則完成了edits和fsimage文件的合并,依此不斷循環,從而到達保證元數據的正確性。在緊急情況下, SecondaryNameNode可以用來恢復namenode的元數據。
?
2.2 YARN集群
Web訪問地址:http://hadoop1:8088
YARN是一個資源調度平臺,負責為運算程序提供服務器運算資源,相當于一個分布式的操作平臺,而Mapreduce等運算程序相當于運行在操作系統之上的應運程序。
YARN組成由ResourceManager、AppMaster進程、NodeManager組成
2.2.1 ResourceManager(主節點)
ResourceManager是master上的進程,負責整個分布式系統的資源管理和調度。他會處理來自client端的請求(包括提交作業/殺死作業);啟動/監控Application Master;監控NodeManager的情況,比如可能掛掉的NodeManager。
2.2.2 NodeManager(從節點)
負責接收并執行ResourceManager分配的計算任務。相對應的,NodeManager時處在slave節點上的進程,他只負責當前slave節點的資源管理和調度,以及task的運行。他會定期向ResourceManager回報資源/Container的情況(heartbeat);接受來自ResourceManager對于Container的啟停命令。
2.2.3 AppMaster進程
每一個提交到集群的作業都會有一個與之對應的Application Master來負責應用程序的管理。他負責進行數據切分;為當前應用程序向ResourceManager去申請資源(也就是Container),并分配給具體的任務;與NodeManager通信,用來啟停具體的任務,任務運行在Container中;而任務的監控和容錯也是由Application Master來負責的。
? ? ? ? 1個計算任務=1個AppMaster進程
? ? ? ? 由該AppMaster進程來監控和管理該計算任務
2.2.4 Container
它包含了Application Master向ResourceManager申請的計算資源,比如說CPU/內存的大小,以及任務運行所需的環境變量和隊任務運行情況的描述。
?
2.3??MapReduce工作原理
MapReduce是一種分布式計算框架。MR的執行流程:
? 1. MR任務分為MapTask任務?ReduceTask任務兩部分, 其中MapTask任務負責:分; ReduceTask任務負責:合。
- ?1個切片(默認128MB) = 1個MapTask任務 = 1個分好區, 排好序, 規好約的磁盤文件;
? ? 2. 先對文件進行切片, 每個切片對應1個MapTask任務, 任務內部會逐行讀取數據, 交由MapTask任務來處理。
? ? 3. MapTask對數據進行分區,排序,規約處理后, 會將數據放到1個 環形緩沖區中(默認大小: 100MB, 溢寫比: 0.8), 達到80MB就會觸發溢寫線程。
? ? 4. 溢寫線程會將環形緩沖區中的結果寫到磁盤的小文件中, 當MapTask任務結束的時候, 會對所有的小文件(10個/次)合并, 形成1個大的磁盤文件。
? ? 5. ReduceTask任務會開啟拷貝線程, 從上述的各個結果文件中, 拉取屬于自己分區的數據, 進行分組、統計、聚合。
? ? 6. ReduceTask將處理后的結果, 寫到結果文件中;
- 1個分區 = 1個ReduceTask任務 = 1個結果文件;
?
2.4? 三者之間的關系
?客戶端Client提交任務到資源管理器(ResourceManager),資源管理器接收到任務之后去NodeManager節點開啟任務(ApplicationMaster), ApplicationMaster向ResourceManager申請資源, 若有資源ApplicationMaster負責開啟任務即MapTask。開始干活了即分析任務,每個map獨立工作,各自負責檢索各自對應的DataNode,將結果記錄到HDFS, DataNode負責存儲,NameNode負責記錄,2nn負責備份部分數據。
?