Hadoop面試復(fù)習(xí)系列——HDFS(一)

轉(zhuǎn)載自:
https://cloud.tencent.com/developer/article/1031641
https://my.oschina.net/freelili/blog/1853668

HDFS優(yōu)缺點(diǎn)

  1. 優(yōu)點(diǎn)
  • 1.1 高容錯(cuò)性

    • 可以由數(shù)百或數(shù)千個(gè)服務(wù)器機(jī)器組成,每個(gè)服務(wù)器機(jī)器存儲(chǔ)文件系統(tǒng)數(shù)據(jù)的一部分;
    • 數(shù)據(jù)自動(dòng)保存多個(gè)副本;
    • 副本丟失后檢測(cè)故障快速,自動(dòng)恢復(fù)。
  • 1.2 適合批處理

    • 移動(dòng)計(jì)算而非數(shù)據(jù);
    • 數(shù)據(jù)位置暴露給計(jì)算框架;
    • 數(shù)據(jù)訪問的高吞吐量;
    • 運(yùn)行的應(yīng)用程序?qū)ζ鋽?shù)據(jù)集進(jìn)行流式訪問。
  • 1.3 適合大數(shù)據(jù)處理

    • 典型文件大小為千兆字節(jié)到太字節(jié);
    • 支持單個(gè)實(shí)例中的數(shù)千萬個(gè)文件;
    • 10K+節(jié)點(diǎn)。
  • 1.4 可構(gòu)建在廉價(jià)的機(jī)器上

    • 通過多副本提高可靠性;
    • 提供了容錯(cuò)與恢復(fù)機(jī)制。
  • 1.5 跨異構(gòu)硬件和軟件平臺(tái)的可移植性強(qiáng)

    • 輕松地從一個(gè)平臺(tái)移植到另一個(gè)平臺(tái)。
  • 1.6 簡(jiǎn)單一致性模型

    • 應(yīng)用程序需要一次寫入多次讀取文件的訪問模型;
    • 除了追加和截?cái)嘀?,不需要更改已?chuàng)建,寫入和關(guān)閉的文件;
    • 簡(jiǎn)化了數(shù)據(jù)一致性問題,并實(shí)現(xiàn)了高吞吐量數(shù)據(jù)訪問;
    • 高度可配置,具有非常適合于許多安裝的默認(rèn)配置。大多數(shù)時(shí)候,只需要為非常大的集群調(diào)整配置。
  1. 缺點(diǎn)
  • 2.1 不適合低延遲的數(shù)據(jù)訪問
    • HDFS設(shè)計(jì)更多的是批處理,而不是用戶交互使用。重點(diǎn)在于數(shù)據(jù)訪問的高吞吐量,而不是數(shù)據(jù)訪問的低延遲。
  • 2.2 不適合小文件存取
    • 占用NameNode大量?jī)?nèi)存;
    • 尋道時(shí)間超過讀取時(shí)間。
  • 2.3 無法并發(fā)寫入、文件隨即修改
    • 一個(gè)文件只能有一個(gè)寫者;
    • 僅支持追加和截?cái)唷?/li>

基本組成

  1. Namenode
  • 接受客戶端的讀寫服務(wù)
    執(zhí)行文件系統(tǒng)命名空間操作,如打開,關(guān)閉和重命名文件和目錄。

  • 管理文件系統(tǒng)命名空間
    記錄對(duì)文件系統(tǒng)命名空間或其屬性的任何更改。

  • 存儲(chǔ)元數(shù)據(jù)信息—metadata
    Metadata是存儲(chǔ)在Namenode上的元數(shù)據(jù)信息,
    它存儲(chǔ)到磁盤的文件名為:fsimage。
    并且有個(gè)叫edits的文件記錄對(duì)metadata的操作日志。
    總體來說,fsimage與edits文件記錄了Metadata中的權(quán)限信息和文件系統(tǒng)目錄樹、
    文件包含哪些塊、
    確定塊到DataNode的映射、
    Block存放在哪些DataNode上(由DataNode啟動(dòng)時(shí)上報(bào))。
    NameNode將這些信息加載到內(nèi)存并進(jìn)行拼裝,
    就成為了一個(gè)完整的元數(shù)據(jù)信息。
    Namenode在內(nèi)存中保存著整個(gè)文件系統(tǒng)的命名空間和文件數(shù)據(jù)塊映射(Blockmap)的映像。
    這個(gè)關(guān)鍵的元數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)得很緊湊,
    因而一個(gè)有4G內(nèi)存的Namenode足夠支撐大量的文件和目錄。
    當(dāng)Namenode啟動(dòng)時(shí),它從硬盤中讀取Edits和FsImage,
    將所有Edits中的事務(wù)作用在內(nèi)存中的FsImage上,
    并將這個(gè)新版本的FsImage從內(nèi)存中保存到本地磁盤上,
    然后刪除舊的Edits,
    因?yàn)檫@個(gè)舊的Edits的事務(wù)都已經(jīng)作用在FsImage上了。
    這個(gè)過程稱為一個(gè)檢查點(diǎn)(checkpoint)。
    Datanode將HDFS數(shù)據(jù)以文件的形式存儲(chǔ)在本地的文件系統(tǒng)中,
    它并不知道有關(guān)HDFS文件的信息。
    它把每個(gè)HDFS數(shù)據(jù)塊存儲(chǔ)在本地文件系統(tǒng)的一個(gè)單獨(dú)的文件中。
    Datanode并不在同一個(gè)目錄創(chuàng)建所有的文件,
    實(shí)際上,它用試探的方法來確定每個(gè)目錄的最佳文件數(shù)目,
    并且在適當(dāng)?shù)臅r(shí)候創(chuàng)建子目錄。
    在同一個(gè)目錄中創(chuàng)建所有的本地文件并不是最優(yōu)的選擇,
    這是因?yàn)楸镜匚募到y(tǒng)可能無法高效地在單個(gè)目錄中支持大量的文件。
    當(dāng)一個(gè)Datanode啟動(dòng)時(shí),它會(huì)掃描本地文件系統(tǒng),
    產(chǎn)生一個(gè)這些本地文件對(duì)應(yīng)的所有HDFS數(shù)據(jù)塊的列表,
    然后作為報(bào)告發(fā)送到Namenode,這個(gè)報(bào)告就是塊狀態(tài)報(bào)告。

  • 管理文件系統(tǒng)命名空間
    HDFS支持傳統(tǒng)的分層文件組織。
    用戶或應(yīng)用程序可以在這些目錄中創(chuàng)建目錄和存儲(chǔ)文件。
    文件系統(tǒng)命名空間層次結(jié)構(gòu)與大多數(shù)其他現(xiàn)有文件系統(tǒng)類似:
    可以創(chuàng)建和刪除文件,
    將文件從一個(gè)目錄移動(dòng)到另一個(gè)目錄,
    或重命名文件。
    HDFS支持用戶配額和訪問權(quán)限。但不支持硬鏈接或軟鏈接。
    NameNode維護(hù)文件系統(tǒng)命名空間。
    對(duì)文件系統(tǒng)命名空間或其屬性的任何更改由NameNode記錄。
    應(yīng)用程序可以指定應(yīng)由HDFS維護(hù)的文件的副本數(shù)。
    文件的副本數(shù)稱為該文件的復(fù)制因子。
    此信息由NameNode存儲(chǔ)。

  1. SecondaryNameNode
    它不是NameNode的備份,但可以作為NameNode的備份,
    當(dāng)因?yàn)閿嚯娀蚍?wù)器損壞的情況,
    可以用SecondNameNode中已合并的fsimage文件作為備份文件恢復(fù)到NameNode上,
    但是很有可能丟失掉在合并過程中新生成的edits信息。
    因此不是完全的備份。
    由于NameNode僅在啟動(dòng)期間合并fsimage和edits文件,
    因此在繁忙的群集上,
    edits日志文件可能會(huì)隨時(shí)間變得非常大。
    較大編輯文件的另一個(gè)副作用是下一次重新啟動(dòng)NameNode需要更長(zhǎng)時(shí)間。
    SecondNameNode的主要功能是幫助NameNode合并edits和fsimage文件,
    從而減少NameNode啟動(dòng)時(shí)間。
  • SNN執(zhí)行合并時(shí)機(jī)
    根據(jù)配置文件配置的時(shí)間間隔fs.checkpoint.period默認(rèn)1小時(shí);
    dfs.namenode.checkpoint.txns,默認(rèn)設(shè)置為1百萬,
    也就是Edits中的事務(wù)條數(shù)達(dá)到1百萬就會(huì)觸發(fā)一次合并,
    即使未達(dá)到檢查點(diǎn)期間。

  • SNN合并流程


    snn合并流程.png
    • 首先生成一個(gè)名叫edits.new的文件用于記錄合并過程中產(chǎn)生的日志信息;
    • 當(dāng)觸發(fā)到某一時(shí)機(jī)時(shí)(時(shí)間間隔達(dá)到1小時(shí)或Edits中的事務(wù)條數(shù)達(dá)到1百萬)時(shí),
      SecondaryNamenode將edits文件、與fsimage文件,
      從NameNode上讀取到SecondNamenode上;
    • 將edits文件與fsimage進(jìn)行合并操作,合并成一個(gè)fsimage.ckpt文件;
    • 將生成的合并后的文件fsimage.ckpt文件轉(zhuǎn)換到NameNode上;
    • 將fsimage.ckpt在NameNode上變成fsimage文件替換NameNode上原有的fsimage文件,
      并將edits.new文件上變成edits文件替換NameNode上原有的edits文件。
    • SNN在hadoop2.x及以上版本在非高可用狀態(tài)時(shí)還存在,
      但是在hadoop2.x及以上版本高可用狀態(tài)下SNN就不存在了,
      在hadoop2.x及以上版本在高可用狀態(tài)下,處于standby狀態(tài)的NameNode來做合并操作。
  1. DataNode
    管理附加到它們運(yùn)行的節(jié)點(diǎn)的存儲(chǔ),
    并允許用戶數(shù)據(jù)存儲(chǔ)在文件中;
    在內(nèi)部,文件被分割成一個(gè)或多個(gè)塊(Block),
    并且這些塊被存儲(chǔ)在一組DataNode中;
    負(fù)責(zé)提供來自文件系統(tǒng)客戶端的讀取和寫入請(qǐng)求;
    執(zhí)行 塊創(chuàng)建,刪除;

    啟動(dòng)DN進(jìn)程的時(shí)候會(huì)向NN匯報(bào)Block信息;
    通過向NN發(fā)送心跳保持與其聯(lián)系(3秒一次),
    如果NN10分鐘沒有收到DN的心跳,
    則認(rèn)為DN已經(jīng)丟失,
    并且復(fù)制其上的Block到其他的DN上。

  • HDFS存儲(chǔ)單元(block)

    • 文件被切分成固定大小的數(shù)據(jù)塊
      默認(rèn)數(shù)據(jù)塊大小為64MB(hadoop1.x)、
      128MB(hadoop2.x)、
      256MB(hadoop3.x),可配置;
      若文件大小不到一個(gè)塊大小,則單獨(dú)存成一個(gè)block,
      block塊是一個(gè)邏輯意義上的概念。
      文件大小是多少,就占多少空間。

    • 一個(gè)文件存儲(chǔ)方式
      按大小被切分成不同的block,存儲(chǔ)到不同的節(jié)點(diǎn)上;
      默認(rèn)情況下,每個(gè)block都有3個(gè)副本;
      block大小與副本數(shù)通過client端上傳文件時(shí)設(shè)置,
      文件上傳成功后副本數(shù)可以變更,block size不可變更。
      將大文件拆分成256MB的block塊,
      每個(gè)block塊分別隨機(jī)存放在不同的節(jié)點(diǎn)上,
      從而避免了數(shù)據(jù)傾斜的問題.

  • 數(shù)據(jù)復(fù)制

    • 數(shù)據(jù)復(fù)制概述
      HDFS被設(shè)計(jì)成能夠在一個(gè)大集群中跨機(jī)器可靠地存儲(chǔ)超大文件。
      它將每個(gè)文件存儲(chǔ)成一系列的數(shù)據(jù)塊,
      除了最后一個(gè),所有的數(shù)據(jù)塊都是同樣大小的。
      為了容錯(cuò),文件的所有數(shù)據(jù)塊都會(huì)有副本。
      每個(gè)文件的數(shù)據(jù)塊大小和副本系數(shù)都是可配置的。
      應(yīng)用程序可以指定某個(gè)文件的副本數(shù)目。
      副本系數(shù)可以在文件創(chuàng)建的時(shí)候指定,也可以在之后改變。
      HDFS中的文件都是一次性寫入的,并且嚴(yán)格要求在任何時(shí)候只能有一個(gè)寫入者。

      Namenode全權(quán)管理數(shù)據(jù)塊的復(fù)制,
      它周期性地從集群中的每個(gè)Datanode接收心跳信號(hào)和塊狀態(tài)報(bào)告(Blockreport)。
      接收到心跳信號(hào)意味著該Datanode節(jié)點(diǎn)工作正常。
      塊狀態(tài)報(bào)告包含了一個(gè)該Datanode上所有數(shù)據(jù)塊的列表。

    • Block的副本放置策略
      副本的存放是HDFS可靠性和性能的關(guān)鍵。
      在大多數(shù)情況下,副本系數(shù)是3,
      HDFS的存放策略是將一個(gè)副本存放在本地機(jī)架的節(jié)點(diǎn)上,
      一個(gè)副本放在同一機(jī)架的另一個(gè)節(jié)點(diǎn)上,
      最后一個(gè)副本放在不同機(jī)架的節(jié)點(diǎn)上。
      這種策略減少了機(jī)架間的數(shù)據(jù)傳輸,這就提高了寫操作的效率。
      機(jī)架的錯(cuò)誤遠(yuǎn)遠(yuǎn)比節(jié)點(diǎn)的錯(cuò)誤少,
      所以這個(gè)策略不會(huì)影響到數(shù)據(jù)的可靠性和可用性。
      于此同時(shí),因?yàn)閿?shù)據(jù)塊只放在兩個(gè)不同的機(jī)架上,
      所以此策略減少了讀取數(shù)據(jù)時(shí)需要的網(wǎng)絡(luò)傳輸總帶寬。
      在這種策略下,副本并不是均勻分布在不同的機(jī)架上。
      三分之一的副本在一個(gè)節(jié)點(diǎn)上,
      三分之二的副本在一個(gè)機(jī)架上,
      其他副本均勻分布在剩下的機(jī)架中,
      這一策略在不損害數(shù)據(jù)可靠性和讀取性能的情況下改進(jìn)了寫的性能。

  • 副本選擇
    為了降低整體的帶寬消耗和讀取延時(shí),HDFS會(huì)盡量讓讀取程序讀取離它最近的副本。
    其計(jì)算方式大致如下:

    1. 相同節(jié)點(diǎn) = 0
    2. 相同機(jī)架不同節(jié)點(diǎn) = 2
    3. 相同數(shù)據(jù)中心不同機(jī)架 = 4
    4. 不同數(shù)據(jù)中心 = 6

    如果在讀取程序的同一個(gè)機(jī)架上有一個(gè)副本,
    那么就讀取該副本。
    如果一個(gè)HDFS集群跨越多個(gè)數(shù)據(jù)中心,
    那么客戶端也將首先讀本地?cái)?shù)據(jù)中心的副本。

  • 安全模式
    NameNode在啟動(dòng)的時(shí)候會(huì)進(jìn)入一個(gè)稱為安全模式的特殊狀態(tài),
    它首先將映像文件(fsimage)載入內(nèi)存,
    并執(zhí)行編輯日志(edits)中的各項(xiàng)操作;
    一旦在內(nèi)存中成功建立文件系統(tǒng)元數(shù)據(jù)映射,
    則創(chuàng)建一個(gè)新的fsimage文件(這個(gè)操作不需要SecondNameNode來做)與一個(gè)空的編輯日志;

    此刻namenode運(yùn)行在安全模式,
    即namenode的文件系統(tǒng)對(duì)于客戶端來說是只讀的,
    顯示目錄、顯示文件內(nèi)容等,
    寫、刪除、重命名都會(huì)失敗;

    在此階段namenode搜集各個(gè)datanode的報(bào)告,
    當(dāng)數(shù)據(jù)塊達(dá)到最小副本數(shù)以上時(shí),
    會(huì)被認(rèn)為是“安全”的,
    在一定比例的數(shù)據(jù)塊被認(rèn)為是安全的以后(可設(shè)置),
    再過若干時(shí)間,安全模式結(jié)束;

    當(dāng)檢測(cè)到副本數(shù)不足數(shù)據(jù)塊時(shí),該塊會(huì)被復(fù)制,
    直到達(dá)到最小副本數(shù),系統(tǒng)中數(shù)據(jù)塊的位置并不是由namenode維護(hù)的,
    而是以塊列表形式存儲(chǔ)在datanode中。

    特別的--當(dāng)namenode節(jié)點(diǎn)的磁盤滿了,HDFS也會(huì)進(jìn)入安全模式,并且此時(shí)無法退出安全模式

  • 數(shù)據(jù)組織

    • 數(shù)據(jù)塊
      HDFS被設(shè)計(jì)成支持大文件,適用HDFS的是那些需要處理大規(guī)模的數(shù)據(jù)集的應(yīng)用。
      這些應(yīng)用都是只寫入數(shù)據(jù)一次,但卻讀取一次或多次,
      并且讀取速度應(yīng)能滿足流式讀取的需要。
      HDFS支持文件的“一次寫入多次讀取”語義。
      一個(gè)典型的數(shù)據(jù)塊大小是256MB。
      因而,HDFS中的文件總是按照256M被切分成不同的塊,
      每個(gè)塊盡可能地存儲(chǔ)于不同的Datanode中。

    • 分段
      詳細(xì)可以查看:https://juejin.im/post/5bec278c5188253e64332c76
      客戶端創(chuàng)建文件的請(qǐng)求其實(shí)并沒有立即發(fā)送給Namenode,
      事實(shí)上,在剛開始階段HDFS客戶端會(huì)先將文件數(shù)據(jù)緩存到本地的一個(gè)臨時(shí)文件。
      應(yīng)用程序的寫操作被透明地重定向到這個(gè)臨時(shí)文件。
      當(dāng)這個(gè)臨時(shí)文件累積的數(shù)據(jù)量超過一個(gè)數(shù)據(jù)塊的大小,
      客戶端才會(huì)聯(lián)系Namenode。
      Namenode將文件名插入文件系統(tǒng)的層次結(jié)構(gòu)中,并且分配一個(gè)數(shù)據(jù)塊給它。
      然后返回Datanode的標(biāo)識(shí)符和目標(biāo)數(shù)據(jù)塊給客戶端。
      接著客戶端將這塊數(shù)據(jù)從本地臨時(shí)文件上傳到指定的Datanode上。
      當(dāng)文件關(guān)閉時(shí),在臨時(shí)文件中剩余的沒有上傳的數(shù)據(jù)也會(huì)傳輸?shù)街付ǖ腄atanode上。
      然后客戶端告訴Namenode文件已經(jīng)關(guān)閉。
      此時(shí)Namenode才將文件創(chuàng)建操作提交到日志里進(jìn)行存儲(chǔ)。
      如果Namenode在文件關(guān)閉前宕機(jī)了,則該文件將丟失。

      上述方法是對(duì)在HDFS上運(yùn)行的目標(biāo)應(yīng)用進(jìn)行認(rèn)真考慮后得到的結(jié)果。
      這些應(yīng)用需要進(jìn)行文件的流式寫入。
      如果不采用客戶端緩存,由于網(wǎng)絡(luò)速度和網(wǎng)絡(luò)堵塞會(huì)對(duì)吞估量造成比較大的影響。
      這種方法并不是沒有先例的,
      早期的文件系統(tǒng),比如AFS,就用客戶端緩存來提高性能。
      為了達(dá)到更高的數(shù)據(jù)上傳效率,已經(jīng)放松了POSIX標(biāo)準(zhǔn)的要求。

    • 管道復(fù)制
      當(dāng)客戶端向HDFS文件寫入數(shù)據(jù)的時(shí)候,
      一開始是寫到本地臨時(shí)文件中。
      假設(shè)該文件的副本系數(shù)設(shè)置為3,
      當(dāng)本地臨時(shí)文件累積到一個(gè)數(shù)據(jù)塊的大小時(shí),
      客戶端會(huì)從Namenode獲取一個(gè)Datanode列表用于存放副本。
      然后客戶端開始向第一個(gè)Datanode傳輸數(shù)據(jù),
      第一個(gè)Datanode一小部分一小部分(4 KB)地接收數(shù)據(jù),
      將每一部分寫入本地倉(cāng)庫(kù),
      并同時(shí)傳輸該部分到列表中第二個(gè)Datanode節(jié)點(diǎn)。
      第二個(gè)Datanode也是這樣,
      一小部分一小部分地接收數(shù)據(jù),寫入本地倉(cāng)庫(kù),
      并同時(shí)傳給第三個(gè)Datanode。
      最后,第三個(gè)Datanode接收數(shù)據(jù)并存儲(chǔ)在本地。
      因此,Datanode能流水線式地從前一個(gè)節(jié)點(diǎn)接收數(shù)據(jù),
      并在同時(shí)轉(zhuǎn)發(fā)給下一個(gè)節(jié)點(diǎn),
      數(shù)據(jù)以流水線的方式從前一個(gè)Datanode復(fù)制到下一個(gè)。

      如果復(fù)制過程中某個(gè)DataNode出現(xiàn)問題,
      并不會(huì)導(dǎo)致該次寫入過程失敗,
      問題DataNode將排出這個(gè)管道,
      其他節(jié)點(diǎn)正常寫入,
      只要有(dfs.namenode.repliction.min 默認(rèn)為1),個(gè)節(jié)點(diǎn)寫入成功,
      那么本次寫入過程就是成功的。
      后續(xù) NameNode 在檢查文件副本數(shù)的時(shí)候,會(huì)幫助恢復(fù)正常

讀寫流程

  • 讀數(shù)據(jù)流程
hdfs讀數(shù)據(jù)流程.jpg
  • 使用HDFS提供的客戶端Client,
    通過 DistributedFileSystem 向遠(yuǎn)程的Namenode發(fā)起RPC請(qǐng)求;

  • Namenode會(huì)視情況返回文件的部分或者全部block列表,
    對(duì)于每個(gè)block, Namenode都會(huì)返回有該block副本的DataNode地址;
    并按照就近原則進(jìn)行排序;

  • 客戶端Client會(huì)選取離客戶端最近的DataNode來讀取block;
    如果客戶端本身就是DataNode, 那么將從本地直接獲取數(shù)據(jù);
    該過程是并行的,也就是說多個(gè)block塊的數(shù)據(jù)可以一起讀取。

  • 讀取完當(dāng)前block的數(shù)據(jù)后, 關(guān)閉當(dāng)前的DataNode鏈接,
    并為讀取下一個(gè)block尋找最佳的DataNode;

  • 當(dāng)讀完列表block后, 且文件讀取還沒有結(jié)束,
    客戶端會(huì)繼續(xù)向Namenode獲取下一批的block列表;

  • 以上這些步驟對(duì)于客戶端來說都是透明的。
    客戶端只需通過 DistributedFileSystem 返回的 FSDataInputStream 讀取數(shù)據(jù)即可

  • 特別的--如果客戶端和所連接的DataNode在讀取時(shí)出現(xiàn)故障,
    那么它就會(huì)去嘗試連接存儲(chǔ)這個(gè)塊的下一個(gè)最近的DataNode,
    同時(shí)它會(huì)記錄這個(gè)節(jié)點(diǎn)的故障,以免后面再次連接該節(jié)點(diǎn)。
    客戶端還會(huì)驗(yàn)證從DataNode傳送過來的數(shù)據(jù)校驗(yàn)和。
    如果發(fā)現(xiàn)一個(gè)損壞塊,那么客戶端將再嘗試從別的DataNode讀取數(shù)據(jù)塊,
    并且會(huì)告訴NameNode 這個(gè)信息,
    NameNode也會(huì)更新保存的文件信息,進(jìn)行數(shù)據(jù)修復(fù)。

  • 寫數(shù)據(jù)流程

    hdfs寫流程.jpg

  • 客戶端調(diào)用create來新建文件。

  • DistributedFileSystem 通過RPC調(diào)用,
    在 NameNode 的文件系統(tǒng)命名空間中創(chuàng)建一個(gè)后綴是.copy新文件,
    此時(shí)還沒有相關(guān)的DataNode與之相關(guān)。

  • NameNode 會(huì)通過多種驗(yàn)證保證新的文件不存在文件系統(tǒng)中,
    并且確保請(qǐng)求客戶端擁有創(chuàng)建文件的權(quán)限。
    當(dāng)所有驗(yàn)證通過時(shí),NameNode 會(huì)創(chuàng)建一個(gè)新文件的記錄,
    如果創(chuàng)建失敗,則拋出一個(gè)IOException異常;
    如果成功, namenode 掌握著集群DataNode整體狀況,
    將第一批 block 塊分配數(shù)據(jù)塊后,
    連同 DataNode 列表信息返回給客戶端;

  • 當(dāng)客戶端寫入數(shù)據(jù)時(shí),DFSOutputStream 會(huì)將文件分割成數(shù)據(jù)包(64k),
    然后放入一個(gè)內(nèi)部隊(duì)列,我們稱為“數(shù)據(jù)隊(duì)列(data queue)”。
    DataStreamer會(huì)將這些小的文件包放入數(shù)據(jù)流中,
    DataStreamer的作用是請(qǐng)求NameNode為新的文件包分配合適的DataNode存放副本。
    返回的DataNode列表形成一個(gè)“管道”,
    假設(shè)這里的副本數(shù)是3,
    那么這個(gè)管道中就會(huì)有3個(gè)DataNode。
    DataStreamer將文件包以流的方式傳送給隊(duì)列中的第一個(gè)DataNode。
    第一個(gè)DataNode會(huì)存儲(chǔ)這個(gè)包,
    然后將它推送到第二個(gè)DataNode中,
    隨后照這樣進(jìn)行,直到管道中的最后一個(gè)DataNode,
    這種 pipeline 的方式加快了寫入過程,
    并隱藏了副本數(shù)對(duì)客戶端的影響,
    即 對(duì)客戶端來說,副本數(shù)是透明的。
    副本的放置遵循 Block的副本放置策略

  • DFSOutputStream同時(shí)也會(huì)保存一個(gè)包的內(nèi)部隊(duì)列,
    用來等待管道中的DataNode返回確認(rèn)信息,
    這個(gè)隊(duì)列被稱為確認(rèn)隊(duì)列(ask queue)。
    只有當(dāng)所有的管道中的DataNode都返回了寫入成功的信息文件包,
    才會(huì)從確認(rèn)隊(duì)列中刪除。

  • 客戶端完成數(shù)據(jù)寫入后,對(duì)數(shù)據(jù)流調(diào)用close方法。
    該操作將剩余的所有數(shù)據(jù)寫入dataNode管線,
    當(dāng)DataNode 向 NameNode 心跳匯報(bào)的時(shí)候,
    新寫入的 block 信息被更新到 NameNode.
    第一批block 塊的寫入完成

  • 重復(fù)以上過程,客戶端繼續(xù)第二批 block 塊的寫入,直至最后一批寫入完成結(jié)束!

  • 特別的--當(dāng)出現(xiàn)寫入某個(gè)DataNode失敗時(shí),HDFS會(huì)作出以下反應(yīng):
    首先管道會(huì)被關(guān)閉,任何在 確認(rèn)隊(duì)列 中的文件包都會(huì)被添加到數(shù)據(jù)隊(duì)列的前端,以確保故障節(jié)點(diǎn)下游的datanode不會(huì)漏掉任何一個(gè)數(shù)據(jù)包。

    為存儲(chǔ)在另一個(gè)正常的datanode的當(dāng)前數(shù)據(jù)塊指定一個(gè)新的標(biāo)識(shí),并將標(biāo)識(shí)傳送給nameNode,當(dāng)dataNode 在恢復(fù)后,會(huì)發(fā)現(xiàn)其原來的標(biāo)識(shí)是過時(shí)的,于是就可以刪除存儲(chǔ)的不完整的那部分?jǐn)?shù)據(jù)塊。

    從管線中刪除故障datanode,基于兩個(gè)正常的datanode構(gòu)建新的管線。余下的數(shù)據(jù)庫(kù)寫入管線中正常的datanode。

    namenode在注意到副本不足時(shí),會(huì)在另一個(gè)節(jié)點(diǎn)上創(chuàng)建一個(gè)新的副本。后續(xù)的數(shù)據(jù)塊繼續(xù)正常的接受處理。

    如果有多個(gè)節(jié)點(diǎn)的寫入失敗了,如果滿足了最小備份數(shù)的設(shè)置(dfs.namenode.repliction.min),寫入也將會(huì)成功

  • 寫入一致性
    新建一個(gè)文件后,它能夠在文件系統(tǒng)命名空間中立即可見
    寫入文件的內(nèi)容不保證立即可見(即逝數(shù)據(jù)流已經(jīng)調(diào)用flush()方法刷新并存儲(chǔ))
    當(dāng)前正在寫入的塊對(duì)其他reader不可見。
    通過hflush()方法后,數(shù)據(jù)被寫入datanode的內(nèi)存中??杀WC對(duì)所有reader可見
    通過hsync()方法后,數(shù)據(jù)被寫入到磁盤上。
    如果沒有調(diào)用hflush或者h(yuǎn)sync()方法??蛻舳嗽诠收系那闆r下就會(huì)存在數(shù)據(jù)塊丟失

后記

本文主要是記錄了個(gè)人在復(fù)習(xí)過程看到的一些知識(shí)點(diǎn),可能有點(diǎn)東拼西湊的感覺,但是作為復(fù)習(xí)來看看還是不錯(cuò)的。當(dāng)然關(guān)于 HDFS 肯定不止這么一點(diǎn)東西,不過作為開發(fā),運(yùn)維相關(guān)的其實(shí)很少用到,不過還是有一些需要補(bǔ)充的,比如:高可用,HDFS shell相關(guān)。。。誒,其實(shí)前面有幾篇文章說后續(xù)會(huì)補(bǔ)上,但是因?yàn)楦鞣N原因,還在那里欠著,還好沒人計(jì)較,也就是自己在自?shī)首詷贰!!9?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、目標(biāo) HDFS 全稱hadoop分布式文件系統(tǒng),其最主要的作用是作為 Hadoop 生態(tài)中各系統(tǒng)的存儲(chǔ)服務(wù)。 ...
    Alukar閱讀 2,636評(píng)論 1 18
  • hadoop HDFS原理解析01 HDFS架構(gòu)?NameNode?DataNode?Sencondary Nam...
    白菜青蘿卜閱讀 2,848評(píng)論 2 30
  • 今天我讀的書是。紅樓夢(mèng)第二回,我家敗落,余罪,喪尸被關(guān)后去了。楊志叫紅玉。老公。不要弄,母親去世。此后,過了一年多...
    五三胡連海閱讀 332評(píng)論 0 1
  • 康誥曰:“克明德?!贝蠹自唬骸邦櫿溙熘髅??!钡鄣湓唬骸翱嗣骶??!苯宰悦饕?。 湯之盤銘曰:“...
    六年級(jí)房廉碧閱讀 247評(píng)論 0 0
  • 馬云說過,“很多人輸就輸在,對(duì)于新興事物,第一看不見,第二看不起,第三看不懂,第四來不及?!?我們?nèi)绾尾拍茏稣驹陲L(fēng)...
    藝迦迦閱讀 2,517評(píng)論 0 15

友情鏈接更多精彩內(nèi)容