HDFS原理剖析

一、概述

HDFS是Hadoop的分布式文件系統(Hadoop Distributed File System),實現大規模數據可靠的分布式讀寫。HDFS針對的使用場景是數據讀寫具有“一次寫,多次讀”的特征,而數據“寫”操作是順序寫,也就是在文件創建時的寫入或者在現有文件之后的添加操作。HDFS保證一個文件在一個時刻只被一個調用者執行寫操作,而可以被多個調用者執行讀操作。

二、HDFS結構

HDFS包含主、備NameNode和多個DataNode,如下圖所示。
HDFS是一個Master/Slave的架構,在Master上運行NameNode,而在每一個Slave上運行DataNode,ZKFC需要和NameNode一起運行。
NameNode和DataNode之間的通信都是建立在TCP/IP的基礎之上的。NameNode、DataNode、ZKFC和JournalNode能部署在運行Linux的服務器上。
在這里插入圖片描述

名稱描述
NameNode用于管理文件系統的命名空間、目錄結構、元數據信息以及提供備份機制等,分為:1. Active NameNode:管理文件系統的命名空間、維護文件系統的目錄結構樹以及元數據信息;記錄寫入的每個“數據塊”與其歸屬文件的對應關系。2. Standby NameNode:與Active NameNode中的數據保持同步;隨時準備在Active NameNode出現異常時接管其服務。3.Observer NameNode:與Active NameNode中的數據保持同步,處理來自客戶端的讀請求。
DataNode用于存儲每個文件的“數據塊”數據,并且會周期性地向NameNode報告該DataNode的數據存放情況。
JournalNodeHA集群下,用于同步主備NameNode之間的元數據信息。
ZKFCZKFC是需要和NameNode一一對應的服務,即每個NameNode都需要部署ZKFC。它負責監控NameNode的狀態,并及時把狀態寫入ZooKeeper。ZKFC也有選擇誰作為Active NameNode的權利。
ZK ClusterZooKeeper是一個協調服務,幫助ZKFC執行主NameNode的選舉。
HttpFS gatewayHttpFS是個單獨無狀態的gateway進程,對外提供webHDFS接口,對HDFS使用FileSystem接口對接。可用于不同Hadoop版本間的數據傳輸,及用于訪問在防火墻后的HDFS(HttpFS用作gateway)。

HttpFS是個單獨無狀態的gateway進程,對外提供webHDFS接口,對HDFS使用FileSystem接口對接。可用于不同Hadoop版本間的數據傳輸,及用于訪問在防火墻后的HDFS(HttpFS用作gateway)。

三、HDFS原理

使用HDFS的副本機制來保證數據的可靠性,HDFS中每保存一個文件則自動生成1個備份文件,即共2個副本。HDFS副本數可通過“dfs.replication”參數查詢。

  • 當集群中Core節點規格選擇為非本地盤(hdd)時,若集群中只有一個Core節點,則HDFS默認副本數為1。若集群中Core節點數大于等于2,則HDFS默認副本數為2。
  • 當集群中Core節點規格選擇為本地盤(hdd)時,若集群中只有一個Core節點,則HDFS默認副本數為1。若集群中有兩個Core節點,則HDFS默認副本數為2。若集群中Core節點數大于等于3,則HDFS默認副本數為3。
    在這里插入圖片描述

HDFS組件支持以下部分特性:

  • HDFS組件支持糾刪碼,使得數據冗余減少到50%,且可靠性更高,并引入條帶化的塊存儲結構,最大化的利用現有集群單節點多磁盤的能力,使得數據寫入性能在引入編碼過程后,仍和原來多副本冗余的性能接近。
  • 支持HDFS組件上節點均衡調度和單節點內的磁盤均衡調度,有助于擴容節點或擴容磁盤后的HDFS存儲性能提升。

關于Hadoop的架構和詳細原理介紹,請參見:http://hadoop.apache.org/。

四、HDFS HA方案背景

在Hadoop2.0.0之前,HDFS集群中存在單點故障問題。由于每個集群只有一個NameNode,如果NameNode所在機器發生故障,將導致HDFS集群無法使用,除非NameNode重啟或者在另一臺機器上啟動。這在兩個方面影響了HDFS的整體可用性:

  1. 當異常情況發生時,如機器崩潰,集群將不可用,除非重新啟動NameNode。
  2. 計劃性的維護工作,如軟硬件升級等,將導致集群停止工作。

針對以上問題,HDFS高可用性方案通過自動或手動(可配置)的方式,在一個集群中為NameNode啟動一個熱替換的NameNode備份。當一臺機器故障時,可以迅速地自動進行NameNode主備切換。或者當主NameNode節點需要進行維護時,通過集群管理員控制,可以手動進行NameNode主備切換,從而保證集群在維護期間的可用性。

有關HDFS自動故障轉移功能,請參閱:
https://hadoop.apache.org/docs/r3.3.1/hadoop-project-dist/hadoophdfs/HDFSHighAvailabilityWithQJM.html#Automatic_Failover

五、HDFS HA實現方案

在這里插入圖片描述
在一個典型的HA集群中(如上圖所示),需要把兩個NameNodes配置在兩臺獨立的機器上。在任何一個時間點,只有一個NameNode處于Active狀態,另一個處于Standby狀態。Active節點負責處理所有客戶端操作,Standby節點時刻保持與Active節點同步的狀態以便在必要時進行快速主備切換。

為保持Active和Standby節點的數據一致性,兩個節點都要與一組稱為JournalNode的節點通信。當Active對文件系統元數據進行修改時,會將其修改日志保存到大多數的JournalNode節點中,例如有3個JournalNode,則日志會保存在至少2個節點中。Standby節點監控JournalNodes的變化,并同步來自Active節點的修改。根據修改日志,Standby節點將變動應用到本地文件系統元數據中。一旦發生故障轉移,Standby節點能夠確保與Active節點的狀態是一致的。這保證了文件系統元數據在故障轉移時在Active和Standby之間是完全同步的。

為保證故障轉移快速進行,Standby需要時刻保持最新的塊信息,為此DataNodes同時向兩個NameNodes發送塊信息和心跳。

對一個HA集群,保證任何時刻只有一個NameNode是Active狀態至關重要。否則,命名空間會分為兩部分,有數據丟失和產生其他錯誤的風險。為保證這個屬性,防止“split-brain”問題的產生,JournalNodes在任何時刻都只允許一個NameNode寫入。在故障轉移時,將變為Active狀態的NameNode獲得寫入JournalNodes的權限,這會有效防止其他NameNode的Active狀態,使得切換安全進行。

關于HDFS高可用性方案的更多信息,可參考如下鏈接:

https://hadoop.apache.org/docs/r3.3.1/hadoop-project-dist/hadoophdfs/HDFSHighAvailabilityWithQJM.html

六、HDFS和HBase的關系

HDFS是Apache的Hadoop項目的子項目,HBase利用Hadoop HDFS作為其文件存儲系統。HBase位于結構化存儲層,Hadoop HDFS為HBase提供了高可靠性的底層存儲支持。除了HBase產生的一些日志文件,HBase中的所有數據文件都可以存儲在Hadoop HDFS文件系統上。

七、HDFS和MapReduce的關系

  • HDFS是Hadoop分布式文件系統,具有高容錯和高吞吐量的特性,可以部署在價格低廉的硬件上,存儲應用程序的數據,適合有超大數據集的應用程序。
  • 而MapReduce是一種編程模型,用于大數據集(大于1TB)的并行運算。在MapReduce程序中計算的數據可以來自多個數據源,如Local FileSystem、HDFS、數據庫等。最常用的是HDFS,可以利用HDFS的高吞吐性能讀取大規模的數據進行計算。同時在計算完成后,也可以將數據存儲到HDFS。

八、HDFS和Spark的關系

通常,Spark中計算的數據可以來自多個數據源,如Local File、HDFS等。最常用的是HDFS,用戶可以一次讀取大規模的數據進行并行計算。在計算完成后,也可以將數據存儲到HDFS。

分解來看,Spark分成控制端(Driver)和執行端(Executor)。控制端負責任務調度,執行端負責任務執行。
讀取文件的過程如下圖所示。
在這里插入圖片描述
讀取文件步驟的詳細描述如下所示:

  1. Driver與HDFS交互獲取File A的文件信息。
  2. HDFS返回該文件具體的Block信息。
  3. Driver根據具體的Block數據量,決定一個并行度,創建多個Task去讀取這些文件Block。
  4. 在Executor端執行Task并讀取具體的Block,作為RDD(彈性分布數據集)的一部分。

寫入文件的過程如下圖所示。
在這里插入圖片描述
HDFS文件寫入的詳細步驟如下所示:

  1. Driver創建要寫入文件的目錄。
  2. 根據RDD分區分塊情況,計算出寫數據的Task數,并下發這些任務到Executor。
  3. Executor執行這些Task,將具體RDD的數據寫入到步驟1創建的目錄下。

九、HDFS和ZooKeeper的關系

ZooKeeper與HDFS的關系如下圖所示
在這里插入圖片描述
ZKFC(ZKFailoverController)作為一個ZooKeeper集群的客戶端,用來監控NameNode的狀態信息。ZKFC進程僅在部署了NameNode的節點中存在。HDFS NameNode的Active和Standby節點均部署有zkfc進程。

  1. HDFS NameNode的ZKFC連接到ZooKeeper,把主機名等信息保存到ZooKeeper中,即“/hadoop-ha”下的znode目錄里。先創建znode目錄的NameNode節點為主節點,另一個為備節點。HDFS NameNode Standby通過ZooKeeper定時讀取NameNode信息。
  2. 當主節點進程異常結束時,HDFS NameNode Standby通過ZooKeeper感知“/hadoop-ha”目錄下發生了變化,NameNode會進行主備切換。

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

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

相關文章

STM32 LL庫+STM32CubeMX--LED呼吸燈

一、前期準備 硬件:STM32F103C8T6開發板調試工具:DAPLink(本次使用)或USB-TTL開發環境:STM32CubeMX、Keil、Vscode(可選)LED:使用PA0(TIM2_CH1)輸出PWM,LED的陰極接GND 二、使用定時器中斷產生PWM STM32F103C8T6在72…

scope,deep穿透的實際應用

一.父組件代碼 <template><div id"app"><h1 class"box"><pageName> </pageName></h1></div> </template><script> import pageName from "../src/components/pageName.vue"; export de…

Java中的==和equals():區別詳解

大家好&#xff01;在 Java 編程中&#xff0c;比較對象的相等性是一個常見的任務。然而&#xff0c;你是否知道在 Java 中有兩種不同的方法來比較對象的相等性&#xff1a; 操作符和 equals() 方法&#xff1f;本文將深入探討這兩種方法之間的區別以及何時使用它們。 操作符 …

arcgis pro3.0-3.0.1-3.0.2安裝教程大全及安裝包下載

一. 產品介紹&#xff1a; ArcGIS Pro 這一功能強大的單桌面 GIS 應用程序是一款功能豐富的軟件&#xff0c;采用 ArcGIS Pro 用戶社區提供的增強功能和創意進行開發。 ArcGIS Pro 支持 2D、3D 和 4D 模式下的數據可視化、高級分析和權威數據維護。 支持通過 Web GIS 在一系列 …

KafkaStream:基本使用

簡介&#xff1a; kafkaStream&#xff1a;提供了對存儲在kafka中的數據進行流式處理和分析的功能 特點&#xff1a; KafkasSream提供了一個非常簡單輕量的Library&#xff0c;它可以非常方便的嵌入到java程序中&#xff0c;也可以任何方式打包部署 入門案例&#xff1a; 1、…

jenkins自動化部署Jenkinsfile文件配置

簡介 使用jenkins部署時會讀取項目中Jenkinsfile文件&#xff0c;文件配置不對會導致部署失敗 文件內容 pipeline {agent anyparameters {string(name: project_name, defaultValue: xxx1, description: 項目jar名稱)string(name: version, defaultValue: xxx2, description…

【Apollo】阿波羅自動駕駛:塑造自動駕駛技術的未來

前言 Apollo (阿波羅)是一個開放的、完整的、安全的平臺&#xff0c;將幫助汽車行業及自動駕駛領域的合作伙伴結合車輛和硬件系統&#xff0c;快速搭建一套屬于自己的自動駕駛系統。 開放能力、共享資源、加速創新、持續共贏是 Apollo 開放平臺的口號。百度把自己所擁有的強大、…

Java之SpringCloud Alibaba【四】【微服務 Sentinel服務熔斷】

Java之SpringCloud Alibaba【四】【微服務 Sentinel服務熔斷】 一、分布式系統遇到的問題1、服務掛掉的一些原因 二、解決方案三、Sentinel&#xff1a;分布式系統的流量防衛兵1、Sentinel是什么2、Sentinel和Hystrix對比3、Sentinel快速開發4、通過注解的方式來控流5、啟動Sen…

DoIP學習筆記系列:(五)“安全認證”的.dll從何而來?

文章目錄 1. “安全認證”的.dll從何而來?1.1 .dll文件base1.2 增加客戶需求算法傳送門 DoIP學習筆記系列:導航篇 1. “安全認證”的.dll從何而來? 無論是用CANoe還是VFlash,亦或是編輯cdd文件,都需要加載一個與$27服務相關的.dll(Windows的動態庫文件),這個文件是從哪…

Go 流程控制

if語句使用 package mainimport "fmt"func main() {score : 700if score 700 {fmt.Println("清華")}//if支持一個初始化語句 初始化語句和條件判斷用;分割if a : 700; a 700 {fmt.Println("清華")}}清華 清華if_else使用 package mainimpor…

機器學習深度學習——seq2seq實現機器翻譯(數據集處理)

&#x1f468;?&#x1f393;作者簡介&#xff1a;一位即將上大四&#xff0c;正專攻機器學習的保研er &#x1f30c;上期文章&#xff1a;機器學習&&深度學習——從編碼器-解碼器架構到seq2seq&#xff08;機器翻譯&#xff09; &#x1f4da;訂閱專欄&#xff1a;機…

yolo源碼注釋1——文件結構

代碼基于yolov5 v6.0 目錄&#xff1a; yolo源碼注釋1——文件結構yolo源碼注釋2——數據集配置文件yolo源碼注釋3——模型配置文件yolo源碼注釋4——yolo-py datasets # 用于存放數據集的默認文件夾yolov5 data # 模型訓練的超參數配置文件以及數據集配置文件 hyps # 存放超參…

C語言學習錯題集(五)

1.最大公倍數的求法(gcd已知) 2.報數 3.字符串最后必須有’\0’!!! 4.例題 5.例題 6.例題 1.最大公倍數的求法(gcd已知) int lcmgcd*(a/gcd)*(b/gcd);2.報數 報數游戲是這樣的&#xff1a;有n個人圍成一圈&#xff0c;按順序從1到n編好號。從第一個人開始報數&#xff0c;報到…

工程項目管理系統源碼+功能清單+項目模塊+spring cloud +spring boot em

? 工程項目管理軟件&#xff08;工程項目管理系統&#xff09;對建設工程項目管理組織建設、項目策劃決策、規劃設計、施工建設到竣工交付、總結評估、運維運營&#xff0c;全過程、全方位的對項目進行綜合管理 工程項目各模塊及其功能點清單 一、系統管理 1、數據字典&#…

代碼保護 code protection

為什么要做代碼保護&#xff1f; 為了保護知識產權并讓攻擊者的利用更加困難&#xff0c;組織應該為其軟件的逆向工程設置障礙(例如&#xff0c;反篡改、調試保護、反盜版特性、運行時完整性)&#xff0c;增加攻擊者分析和利用你的軟件所需的投入。代碼保護對于廣泛分布的代碼…

Markdown使用筆記

Markdown使用筆記 一、段落與強調 important denotes the impossible thing to do Because your ugly appearance, you cannot have a happy ending. 使用*括起來的為斜體 使用**括起來的是粗體 使用~~括起來的是刪除線 在句子后面添加<br>即可換行 二、標題 在…

常見期權策略類型有哪些?

這幾天在做一個期權策略類型的整理分類&#xff0c;怎么解釋期權策略&#xff0c;期權策略是現代金融市場中運用非常廣泛、變化非常豐富、結構非常精妙的金融衍生產品&#xff1b;同時也是一種更為復雜也更為靈活的投資工具&#xff0c;下文介紹常見期權策略類型有哪些&#xf…

iptables安全技術和防火墻

通信五元素 源ip和目標ip 源端口和目標端口 協議 通信四元素 源ip和目標ip 源端口和目標端口 iptables表鏈結構 Netfilter Linux防火墻是由Netfilter組件提供的&#xff0c;Netfilter工作在內核空間&#xff0c;集成在linux內核中 Netfilter是Linux 2.4.x之后新一代的Li…

CI/CD流水線實戰

不知道為什么&#xff0c;現在什么技術都想學&#xff0c;因為我覺得我遇到了技術的壁壘&#xff0c;大的項目接觸不到&#xff0c;做的項目一個字辣*。所以&#xff0c;整個人心浮氣躁&#xff0c;我已經得通過每天的騎行和長跑緩解這種浮躁了。一個周末&#xff0c;我再次宅在…

k8s問題匯總

作者前言 本文章為記錄使用k8s遇到的問題和解決方法&#xff0c;文章持續更新中… 目錄 作者前言正常配置ingress&#xff0c;但是訪問錯誤添加工作節點報錯安裝k8s報錯使用kubectl命令報錯container沒有運行安裝會出現kubelet異常&#xff0c;無法識別刪除k8s集群訪問dashboa…