Hadoop架構詳解

Hadoop 是一個開源的分布式計算系統,用于存儲和處理大規模數據集。Hadoop 主要由HDFS(Hadoop Distributed File System)、MapReduce、Yarn(Jobtracker,TaskTracker)三大核心組件組成。其中HDFS是分布式文件系統,用于存儲文件,MapReducer是計算框架,可以分為Map和Reduce兩部分,簡單來說就是先分組,后計算,而Yarn則是對主機資源的協調,輔助計算的順利進行。

1. HDFS(Hadoop Distributed File System)

HDFS基本架構

HDFS負責存儲所有文件。他將大型文件分成若干個數據塊,默認情況下,HDFS 的數據塊大小為 128MB(可以配置),方便計算的分布式進行,提高計算效率。每個數據塊還可以生成多個副本,存儲在不同主機中提高系統容錯率。

HDFS中有三個角色發揮著主要作用,分別是NameNode,DataNode,Secondary NameNode。

  • NameNode:主要負責管理集群中的所有數據,包括DataNode節點信息,以及文件保存的位置信息等等。
  • DataNode:實際存儲數據的節點,一個集群中存在多個DataNode,互相不知道對方的信息,需要和NameNode保持心跳,匯報存儲狀態。當DataNode沒有定期向NameNode發送心跳時,會觸發NameNode的故障恢復,例如副本重新分配。
  • Secondary NameNode:從名字來看,難道是NameNode的備份節點?當NameNode宕機時代替NameNode發揮作用?實際上并不是,他的作用是幫助NameNode優化磁盤空間。和大多數持久化數據的中間件一樣,HDFS對于集群元數據的持久化也是通過快照和日志來持久化進磁盤,不過Hadoop作為大型文件分布式處理系統,其操作日志非常龐大,如果靠操作日志來持久化文件,將要占用極高的磁盤空間,使用快照文件能夠顯著的壓縮信息持久化體積,不過由于操作日志的內容過于巨大,將操作日志變為快照的過程極為耗時,如果這一操作由NameNode完成,可能會導致Hadoop集群的正常服務受到影響,所以Hadoop使用Secondary NameNode這一角色來完成這一過程,Secondary NameNode會定期的向NameNode獲取快照文件(FsImage ),以及操作日志(EditLog),并且講操作日志的內容,補充進快照文件,再將快照文件返回給NameNode,幫助NameNode完成一次信息壓縮。

通常上面的學習,我們可以得到一個簡單的HDFS架構圖如下:

在這里插入圖片描述

HDFS存儲數據流程

  1. 當一個客戶端想要向Hadoop中的HDFS中存儲數據時,首先他需要將大型文件按照要求的文件大小進行分塊,
  2. 將文件進行分塊后,客戶端會向NameNode發送請求(多個數據塊可能會并發請求),NameNode再確認文件不存在后(如果已經存在會拋出錯誤),集群的元數據信息,給這個數據塊,及其副本分配位置。

NameNode在給數據塊分配位置時,會考慮到節點當前的負載程度,存儲空間,節點是否存活等因素,并且還會盡可能將其副本分配到不同主機,甚至機架中(機架需要在配置文件中配置機架感知)。

  1. 客戶端在接收到NameNode返回的信息后,會按照NameNode的安排,開始將數據塊傳向第一個DataNode。當第一個DataNode接收完成后,會繼續將數據發向下一個DataNode(注意這里是第一個DataNode向第二個DataNode發送數據塊,而不是客戶端向第二個DataNode發送)。在此期間,DataNode會持續向NameNode以及客戶端匯報進度。
  2. 當所有數據傳輸完成后,客戶端會向NameNode發送一個寫入完成的請求,NameNode會根據客戶端發送的信息來更新自己的集群元數據。

流程圖如下:

在這里插入圖片描述

2. MapReduce

MapReduce是建立在HDFS基礎之上的Hadoop計算框架之一(還有很多其他的計算框架),用于處理大量數據塊并發計算的計算框架,MapReduce可以分為四個階段。

輸入分割(Input Splitting)

在這一階段,輸入數據被分割成較小的塊,稱為輸入分割(Input Splits)。每個輸入分割的大小通常與 Hadoop 分布式文件系統(HDFS)的塊大小一致,用戶可以通過配置參數(如 mapreduce.input.fileinputformat.split.minsize 和 mapreduce.input.fileinputformat.split.maxsize)調整大小。這些分割被分配給不同的映射任務(Map Tasks)進行處理。客戶端也可以自由選擇分塊大小,甚至大于HDFS分塊大小,因為MapReducer的分塊是邏輯分塊,是指向實際文件的引用,并不是物理分塊,不受HDFS分塊大小的限制。

Map階段(Mapping)

分塊完畢后,每個Map任務通過RecordReader從輸入分片中解析出一個個鍵值對。這個過程涉及到如何定義記錄邊界,例如在文本文件中,可能每一行被視為一個記錄。RecordReader的作用是將輸入分片的內容轉換為可以作為Map函數輸入的鍵值對形式。例如,在單詞計數中,RecordReader可能將文本行分割成單詞,并輸出如 <“Hadoop”, 1> 的鍵值對。

Hadoop會將映射任務盡量分配到其數據所在節點上,以節省網絡帶寬和提升性能。也就是計算資源向數據移動,這被稱為數據本地性(Data Locality)。當無法將計算任務分配到目標主機時,Hadopp考慮機架感知,將任務分配到同一機架的主機中(機架感知需要手動配置)。

洗牌和排序階段(Shuffling and Sorting)

在Map輸出鍵值對后、Reducer輸入前進行一次局部規約操作,稱為Combiner。這一步驟是可選的優化項,可以看作是對數據的局部計算,比如說在單詞計數的例子中,規約就會將當前分塊的單詞進行局部匯總。然后將得到的結果傳入分區,通過規約的方式可以減少傳輸到Reducer的數據量,提高整體效率。

Combiner完成后,會進一步對結果進行分區(Partition)、排序(Sort)等多個子階段。在這個過程中,Map輸出的結果會被寫入內存緩沖區(默認大小 100MB,可通過 mapreduce.task.io.sort.mb 配置)。當緩沖區達到閾值(如 80%,可通過 mapreduce.map.sort.spill.percent 配置)時,后臺線程會將其溢寫到磁盤;隨后,Reduce任務會從各個Map節點拉取屬于自己的那部分數據,并對其進行合并、排序、分組等預處理操作。

分區操作是將鍵值對發向目標reducer,而排序是將分區結果進一步分類,將相同的key,放在一起,比如說如果分區結果一個reducer需要處理的鍵值對如下:

(world, 1)
(hadoop, 1)
(world, 1)
(mapreduce, 1)

那么經過排序后,結果是:

(hadoop, 1)
(mapreduce, 1)
(world, 1)
(world, 1)

如果在Combiner階段出現兩個(world, 1),可能會變成(world, 2),這就叫規約。

reducer在開始拉取數據時,還需要再次進行合并、排序和分組,因為在洗牌和排序階段的排序是單節點的,而reducer需要從多個節點拉取數據,所以需要將結果進行合并,在排序,并且按照既定規則進行分組。分組規則可以自定義,reducer每次會根據分組處理一組數據。

Reducer階段

分組結束后,Hadoop會將這些分組數據依次交給對應的Reducer執行,Reducer的數量由用戶通過配置參數 mapreduce.job.reduces預先指定,默認值為 1。Reduce 任務數會影響并行度和輸出文件數量。Reducer 的輸入是一個迭代器(Iterator),它指向當前分組的所有值。每次調用Reducer時都會傳入一個分組。Reducer 會依次按照用戶定義的Reducer函數(一個傳入HDFS的jar包)處理每一組數據。并將結果將處理結果輸出到指定的目標位置,通常是 HDFS,且默認以鍵值對形式存儲(可以通過 OutputFormat 自定義輸出格式,例如文本或序列化文件)。

流程圖

在這里插入圖片描述

3. Yarn

對于計算框架中,計算像向數據移動的理念,需要一個調度器來輔助執行,Yarn就是這樣的一個調度器,他承接這在計算過程中的資源管理和任務調度的工作,讓每個一個任務都能分配到最佳節點,并監控整個任務的執行情況。

在Hadoop1.x版本中,這一功能是由jobtracker和tasktracker完成的。

3.1 JobTracker和TaskTracker

JobTracker是一個全局服務組件,它在整個Hadoop集群中是唯一的,并且通常運行在一個專門配置的主節點上。他的主要職責包括:

  • 作業調度:接收來自客戶端提交的作業,并將其分解為多個任務(Map任務和Reduce任務)。
  • 資源管理:監控整個集群的資源使用情況,并決定哪些TaskTracker節點可以執行新任務。
  • 狀態監控:持續跟蹤所有正在運行的任務的狀態,并處理任務失敗或節點失效的情況,必要時重新調度任務

當用戶通過客戶端提交一個MapReduce作業時,首先會創建一個JobClient實例。這個JobClient負責與JobTracker進行交互。它會將作業所需的所有文件(如輸入分片信息、客戶端配置文件、jar包(jar包就是客戶端編寫的計算任務)等)上傳到HDFS上,并向JobTracker發送請求來注冊該作業。

JobTracker接收到新的作業請求后,會根據客戶端的配置參數將整個作業拆分為多個Map和Reducer任務,并向NameNode請求數據塊所在位置,以及TaskTracker的狀態信息,盡可能將任務分配給數據所在主機的TaskTracker。當數據所在的主機的TaskTracker過于繁忙時,也會根據機架感知,分配給一個機架的TaskTracker

TaskTracker是運行在每個工作節點上的從屬服務。每個節點上只會有一個TaskTracker實例,它負責以下任務:

  • 任務執行:根據JobTracker的指令執行分配給它的具體任務。
  • 狀態匯報:定期向JobTracker發送心跳信號,報告自身健康狀況及所執行任務的進展。

TaskTracker通過心跳機制,和JobTracker保持連接,并在發送心跳時發送自己的狀態信息。JobTracker會根據這些狀態信息以及數據所在位置,合理的分配任務,并在返回心跳時,返回給目標TaskTracker為其分配的任務。

TaskTracker接收到來自JobTracker分配下來的具體任務之后,會為每一個任務生成一個Task實例,并且啟動相應的Java虛擬機(JVM)去實際運行這個任務(因為任務的計算本質上是執行jar包的內容)。根據接收到的不同類型的動作命令(例如啟動任務、提交結果、終止任務等),TaskTracker會采取相應措施來滿足要求。

如果某個TaskTracker失去聯系超過一定時間,則會被標記為不可用,并且其上正在運行的任務可能需要重新分配給其他可用節點。對于任何失敗的任務,JobTracker會嘗試重新啟動它們直到達到最大重試次數為止。

當所有的Map和Reduce任務都順利完成之后,TaskTracker會通知JobTracker。隨后,JobTracker將正式宣布該作業已完成,并清理相關的臨時資源。同時,如果存在輸出數據的話,也會告知客戶端可以從指定位置下載最終結果。

流程圖

在這里插入圖片描述

這個資源調度架構有一些明顯缺陷:

  1. 首先所有調度任務都會集中在一個JobTracker上,這樣隨著集群的擴展和任務的增加,jobtrakcer的性能會成為集群擴展的瓶頸。
  2. 一旦jobtracker故障,所有計算任務都無法進行。
  3. Hadoop1.x中將TaskTracker中可用資源抽象為插槽,這些插槽的數量以及分類(map還是reducer)由啟動時的hadoop配置決定,這就導致了如果map任務和reducer任務的比例和插槽分類的比例不一致,就會導致資源浪費的問題。
  4. jobtracker不能滿足不同計算框架的任務調度需求。

為了解決這些問題,在hadoop2.x版本中重新引入了Yarn

3.2 Yarn

Yarn將原本的jobtracker負責的任務一分為二,將資源管理和任務調度,分別用兩套結構分別負責。

資源管理

資源管理由ResourceManager和NodeManager負責管理,每個主機上都有一個NodeManager,NodeManager會向集群中唯一的ResourceManager發送主機資源信息,并維持心跳。

當客戶端需要發起一個工作請求時,首先需要攜帶AppMaster、啟動AppMaster的命令、用戶程序等向ResourceManager發起請求,ResourceManager接受請求后會根據資源情況為其分配一個Contarin,并且尋找對應的NodeManager。ResourceManager會將任務分配到對應的NodeManager,NodeManager在接收到任務后會生成一個Container,負責容納AppMaster。

Container是用來代替hadoop1.x中的插槽概念的,和插槽不同的是Container不僅可以隨意容納map和reducer任務,還可以容納AppMaster。

AppMaster是負責任務調度的組件。在Yarn的架構中,為了兼容更多的計算框架的不同的任務調度需求。任務調度組件由計算框架自己實現,也就是說不同的計算框架會使用不同的調度組件,所以需要有客戶端發送。

資源調度

AppMaster在被啟動后,需要向ResourceManager進行注冊,并匯報任務運行狀態。和jobTracker不同的是,ResourceManager不在負責管理大量的map,reducer任務,而是由AppMaster進行管理。

AppMaster會通過心跳向ResourceManager申請任務資源,申請成功后會通知NodeManager,為任務創建Contrainer,并啟動任務。各個任務需要和AppMaster維持心跳并匯報工作進度。在程序運行時,客戶端可以隨時向AppMaster發起請求查看任務進度。

當應用程序運行完成后,ApplicationMaster通知ResourceManager釋放已分配的資源。

通過這些改變,Hadoop2.x解決了Hadoop1.x中的集群擴展問題,ResourceManager的負載能力不再是集群擴展的瓶頸。Container解決了插槽中對于資源利用的問題。多計算框架的兼容問題也隨著AppMaster的出現而被解決。于此同時Hadoop2.x還可以配置多個ResourceManager來解決集群的高可用問題。

集群高可用

ResourceManager的高可用性是通過Active/Standby架構模式實現的,這種設計確保了在任意時刻只有一個ResourceManager處于Active狀態,其余的則處于Standby狀態。Active狀態的ResourceManager會正常處理客戶端的請求,而Standby狀態則處于待機狀態,隨時等待Active狀態的ResourceManager宕機時接管其任務。

為了保證故障切換時的狀態一致性,Active狀態的ResourceManager會將其狀態信息寫入到一個共享的狀態存儲系統中。這個狀態存儲系統可以是基于ZooKeeper的state-store或基于FileSystem的state-store。

FileSystem是Hadoop的一個抽象類,它定義了文件系統的基本操作接口,如創建文件、刪除文件、打開文件、重命名文件等。通過 FileSystem 抽象類,Hadoop 可以輕松地支持多種文件系統。基于FileSystem的state-store就是利用HDFS自身的能力為ResourceManager提供狀態存儲系統能力,可以通過配置實現。

Yarn依賴于Zookeeper來實現自動故障轉移,當Active節點故障時,Standby會通過搶占Zookeeper節點的方式獲取Active狀態,并讀取共享的狀態存儲系統來恢復功能。

如果未啟用自動故障轉移,則管理員必須手動將其中一個ResourceManager轉換為Active。要從一個ResourceManager到另一個ResourceManager進行故障轉移,他們應該先將Active狀態的ResourceManager轉換為Standby,然后將Standby狀態的ResourceManager轉換為Active。所有這些都可以使用yarn rmadmin命令完成。

流程圖(紅色箭頭是心跳)

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70831.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70831.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70831.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek在初創企業、教育和數字營銷領域應用思考

如今&#xff0c;像 DeepSeek 這樣的人工智能工具正在改變企業的運營方式&#xff0c;優化流程并顯著提高生產力。通過重復任務的自動化、大量數據的分析以及內容創建效率的提高&#xff0c;組織正在尋找新的競爭和卓越方式。本文介紹了 DeepSeek 如何用于提高三個關鍵領域的生…

day7作業

編寫一個如下場景&#xff1a; 有一個英雄Hero類&#xff0c;私有成員&#xff0c;攻擊&#xff08;Atx&#xff09;&#xff0c;防御&#xff08;Defense&#xff09;&#xff0c;速度&#xff08;Speed)&#xff0c;生命值&#xff08;Blood)&#xff0c;以及所有的set get 方…

阿里云ack的創建與實戰應用案例

阿里云ack的創建與應用案例 創建前開通ack相關服務&#xff1a;開始創建簡單的魔方游戲&#xff0c;熟悉sv與clb自動注冊創建部署一個nginx 服務示例&#xff1a;走不同域名訪問不同svc資源&#xff1a;為什么需要 Ingress &#xff1f;創建第一個域名的 Deployment和Service。…

青少年編程都有哪些比賽可以參加

Python小學生可參加的賽事&#xff1a; 電子學會青少年編程考級、中國計算機學會編程能力等級認證、藍橋杯、 信奧賽CSP-J/S初賽/NOIP(推薦C)、編程設計、信息素養、科技創新賽&#xff1b; 升學助力(科技特長生、大學)、企業、出國留學&#xff1b; python比賽&am…

MinIO在 Docker中修改登錄賬號和密碼

MinIO在 Docker中修改登錄賬號和密碼 隨著云計算和大數據技術的快速發展&#xff0c;對象存儲服務逐漸成為企業數據管理的重要組成部分。MinIO 作為一種高性能、分布式的對象存儲系統&#xff0c;因其簡單易用、高效可靠的特點而備受開發者青睞。然而&#xff0c;在實際應用中…

pycharm編寫ai大模型api調用程序及常見錯誤

這里寫目錄標題 一級目錄1. 訪問Django項目&#xff0c;python web url時&#xff0c;報錯2. 傳參報名&#xff0c;python web url時&#xff0c;報錯正確訪問結果&#xff1a; 二、購買價格 和 見錯誤碼 一級目錄 1. 訪問Django項目&#xff0c;python web url時&#xff0c;…

RISCV指令集解析

參考視頻&#xff1a;《RISC-V入門&進階教程》1-4-RV32I基本指令集&#xff08;1&#xff09;_嗶哩嗶哩_bilibili privilege是特權指令集&#xff0c;有點系統調用的感覺&#xff0c;要走內核態。unprivilege指令集有點像普通的函數調用。

Java中的TreeMap

TreeMap繼承自AbstractMap&#xff0c;并實現了NavigableMap接口(NavigableMap繼承自SortedMap接口)。底層的數據結構是紅黑樹&#xff0c;按照鍵的自然排序或者自定義實現的規則排序&#xff0c;實現元素的有序性。 特點 元素是有序的&#xff1a;按照key的自然排序或者是自…

vue3表單驗證的時候訪問接口如果有值就通過否則不通過.主動去觸發校驗

頁面有個身份證號碼的校驗。校驗完身份證格式是否符合之后還要去訪問接口查詢這個用戶是否存在。如果存在才通過驗證。否則就校驗不通過 <el-form ref"ruleFormRef" :model"form" label-width"140px" label-position"right" label…

Python常見面試題的詳解24

1. 如何對關鍵詞觸發模塊進行測試 要點 功能測試&#xff1a;驗證正常關鍵詞觸發、邊界情況及大小寫敏感性&#xff0c;確保模塊按預期響應不同輸入。 性能測試&#xff1a;關注響應時間和并發處理能力&#xff0c;保證模塊在不同負載下的性能表現。 兼容性測試&#xff1a;測…

前端Javascrip后端Net6前后分離文件上傳案例(完整源代碼)下載

文件上傳功能在項目開發中非常實用&#xff0c;本案例前端用Javascrip實現&#xff0c;后端用Net6實現 前端Javascrip后端Net6前后分離文件上傳案例&#xff08;完整源代碼&#xff09; 下載鏈接 https://download.csdn.net/download/luckyext/90437795?spm1001.2014.3001.5…

DeepSeek行業應用實踐報告-智靈動力【112頁PPT全】

DeepSeek&#xff08;深度搜索&#xff09;近期引發廣泛關注并成為眾多企業/開發者爭相接入的現象&#xff0c;主要源于其在技術突破、市場需求適配性及生態建設等方面的綜合優勢。以下是關鍵原因分析&#xff1a; 一、技術核心優勢 開源與低成本 DeepSeek基于開源架構&#xf…

C語言綜合案例:學生成績管理系統

C語言綜合案例&#xff1a;學生成績管理系統 需求 1.存儲最多50名學生的信息&#xff08;不使用結構體&#xff09; 2.每個學生包含&#xff1a; 學號&#xff08;字符數組&#xff09;姓名&#xff08;字符數組&#xff09;3門課程成績&#xff08;一維數組&#xff09; …

Day 51 卡瑪筆記

這是基于代碼隨想錄的每日打卡 647. 回文子串 給你一個字符串 s &#xff0c;請你統計并返回這個字符串中 回文子串 的數目。 回文字符串 是正著讀和倒過來讀一樣的字符串。 子字符串 是字符串中的由連續字符組成的一個序列。 示例 1&#xff1a; 輸入&#xff1a;s &q…

結構型模式---外觀模式

概念 外觀模式是一種結構型設計模式&#xff0c;它的核心思想是為復雜的子系統提供一個統一的接口&#xff0c;簡化客戶端與子系統的交互。外觀模式通過引入一個高層接口&#xff0c;隱藏子系統的復雜性&#xff0c;使客戶端更容易使用。 適用場景 用于客戶端無需具體操作子…

DeepSeek開源周第二彈:DeepEP如何用RDMA+FP8讓MoE模型飛起來?

一、引言&#xff1a;MoE模型的通信瓶頸與DeepEP的誕生 在混合專家&#xff08;MoE&#xff09;模型訓練中&#xff0c;專家間的全對全&#xff08;All-to-All&#xff09;通信成為性能瓶頸。傳統方案在跨節點傳輸時帶寬利用率不足50%&#xff0c;延遲高達300μs以上。DeepSee…

多通道數據采集和信號生成的模塊化儀器如何重構飛機電子可靠性測試體系?

飛機的核心電子系統包括發電與配電系統&#xff0c;飛機內部所有設備和系統之間的內部數據通信系統&#xff0c;以及用于外部通信的射頻設備。其他所有航空電子元件都依賴這些關鍵總線進行電力傳輸或數據通信。在本文中&#xff0c;我們將了解模塊化儀器&#xff08;無論是PCIe…

【Godot4.3】基于繪圖函數的矢量蒙版效果與UV換算

概述 在設計圓角容器時突發奇想&#xff1a; 將圓角矩形的每個頂點坐標除以對應圓角矩形所在Rect2的size&#xff0c;就得到了頂點對應的UV坐標。然后使用draw_colored_polygon&#xff0c;便可以做到用圖片填充圓角矩形的效果。而且這種計算的效果就是圖片隨著其填充的圖像縮…

數據存儲:一文掌握存儲數據到MongoDB詳解

文章目錄 一、環境準備1.1 安裝MongoDB1.2 安裝Python MongoDB驅動 二、連接到MongoDB2.1 基本連接2.2 連接到MongoDB Atlas&#xff08;云服務&#xff09; 三、基本CRUD操作3.1 創建&#xff08;Create&#xff09;&#xff1a;插入數據3.2 讀取&#xff08;Read&#xff09;…

算法教程:島的最大面積

算法教程:島的最大面積 我們將首先討論問題和解決方案,然后使用可視化工具(上一篇博客中進行了介紹)來更好地理解搜索過程。 問題描述 我們將要演練的具體問題是問題 Leetcode:島嶼的最大面積。在 Leetcode 上找到的直接問題描述是: 給你一個 m x n 二進制矩陣網格。島…