理解HDFS

HDFS java

HDFS (Hadoop Distributed FileSystem) 是 Hadoop 分佈式文件系統,以流式數據訪問模式來存儲超大文件,運行與商業硬件集羣上,管理網絡中跨多臺計算機存儲的文件系統,是分佈式計算中數據管理的的基礎。node

流式數據訪問模式 : 指的是數據不是一次性獲取過來,而是一點一點獲取,處理流式數據也會一點一點處理。(所有接收在處理的話,延遲會很大)數據庫

(1)HDFS優勢express

  1. 高容錯性:數據自動保存多個副本。它經過增長副本的形式,提升容錯性,某一個副本丟失之後,它能夠自動恢復
  2. 適合批處理
  3. 適合處理大數據
  4. 易於構建在廉價的機器上
  5. 流式數據訪問

(2)HDFS不適合的領域緩存

  1.低延時數據訪問安全

    好比毫秒級的來存儲數據,這是不行的,它作不到。它適合高吞吐率的場景,就是在某一時間內寫入大量的數據。可是它在低延時的狀況下是不行的,好比毫秒級之內讀取數據,這樣它是很難作到的。服務器

    HDFS是單Master的,全部的對文件的請求都要通過它,當請求多時,確定會有延時。網絡

  2.小文件存儲數據結構

    存儲大量小文件的話,它會佔用 NameNode大量的內存來存儲文件、目錄和塊信息(元信息)。這樣是不可取的,由於NameNode的內存老是有限的。小文件存儲的尋道時間會超過讀取時間,它違反了 HDFS的設計目標。架構

  三、併發寫入、文件隨機修改

    一個文件只能有一個寫,不容許多個線程同時寫。僅支持數據 append(追加),不支持文件的隨機修改。

(3)HDFS針對缺點的改善措施

  • HDFS不適合低延時數據訪問,可使用緩存或者多Master節點設計下降Client的數據訪問壓力
  • 存儲小文件問題

    一、利用SequenceFile、MapFile、Har等方式歸檔小文件,這個方法的原理就是把小文件歸檔起來管理,HBase就是基於此的。對於這種方法,若是想找回原來的小文件內容,那就必須得知道與歸檔文件的映射關係。

    二、橫向擴展,一個Hadoop集羣能管理的小文件有限,那就把幾個Hadoop集羣拖在一個虛擬服務器後面,造成一個大的Hadoop集羣。google也是這麼幹過的。

    三、多Master設計,正在研發中的GFS II也要改成分佈式多Master設計,還支持Master的Failover,並且Block大小改成1M,有意要調優處理小文件。(Alibaba DFS的設計,也是多Master設計,它把Metadata的映射存儲和管理分開了,由多個Metadata存儲節點和一個查詢Master節點組成。

(4)HDFS概念

  一、數據塊(block)

   每一個磁盤都有默認的數據塊大小,是磁盤進行讀寫的最小單位,構建與單個磁盤之上的文件系統經過磁盤數據塊進行管理文件系統的塊。相似於磁盤文件系統,HDFS中也有數據塊的概念,HDFS文件系統也被劃分爲多個塊,塊做爲獨立單元。

   HDFS數據塊特色:HDFS中的塊大小比文件系統的塊大,通常默認64MB(Hadoop2中默認爲128MB),而文件系統爲幾千字節。HDFS小於一個塊大小的文件不會佔據整個塊的空間

  二、namenode

   HDFS集羣上有兩類節點:管理節點namenode和工做節點datanode。

   namenode 管理文件系統的命名空間,維護整個文件系統的全部的目錄和文件,以命名空間鏡像文件(fsimage)和編輯日誌文件(edits)的形式永久的存儲在本地。namenode也記錄着每一個塊所在的數據節點信息(不是永久存儲,數據啓動時由數據節點重建)
     沒有namecode節點,文件系統將沒法使用,namenode節點服務的機器毀壞的話,文件系統的全部文件將會所有丟失。所以須要作好容錯機制。
   第一種機制:備份namenode的元數據文件
   第二種機制:運行一個輔助的namenode服務
 
  三、datanode
     datanode是HDFS中的工做節點,根據須要存儲和檢索數據塊(受客戶端或者nodenode的調用),另外datanode會按期的將發送節點中所存儲的數據塊信息

  四、secondarynamenode

    secondarynamenode輔助後臺程序,與namenode通訊,以便按期保存namenode的元數據快照。(namenode的備份容錯機制)

  五、聯邦HDFS

    namenode在內存中保存着每一個文件和每一個數據塊的引用關係(元數據信息),對於一個擁有大量數據的集羣來講,namenode節點上的內存將成爲限制橫向擴展的瓶頸。在Hadoop2中,引入的聯邦HDFS系統容許系統添加namenode實現擴展。每一個namenode管理着系統文件命名空間的一部分(例如一個namenode管理着 /usr目錄下的全部文件,另外一個namenode管理着 /share目錄下的全部文件)

    在聯邦環境下,每一個namenode維護一個命名空間卷(包括數據源和文件的全部數據塊的數據塊池),命名空間卷之間是相互獨立的,一個namenode的失效不會影響另一個namenode,所以集羣中的datanode須要註冊每一個namenode。

 

(6)HDFS結構

HDFS 採用的是Master/Slave架構存儲數據,其中主要的組件:Client、namenode、datanode、secondarynamenode

Client:客戶端

  1. 切分文件:文件上傳 HDFS 的時候,Client 將文件切分紅 一個一個的Block,而後進行存儲
  2. 與 NameNode 交互,獲取文件的位置信息
  3. 與 DataNode 交互,讀取或者寫入數據
  4. Client 提供一些命令來訪問或者管理 HDFS,好比啓動或者關閉HDFS

Namenode:Master節點(管理節點)

  1. 管理着HDFS文件系統的命名空間,維護整個文件系統的目錄和文件(以命名空間鏡像文件fsimage和編輯日誌文件edits存在在本地)
  2. 記錄每一個數據庫所在你節點的信息(不是永久存儲,數據啓動時由數據節點從新建立)
  3. 做爲一個管理節點,監控datanode節點的運行情況

Datanode:Slave節點(工做節點)

  1. 文件存儲的地方。
  2. 按期發送節點中所存儲的節點信息給namenode,讓namenode瞭解datanode是否健康運行(默認3s)

secondarynamenode:namenode輔助節點,作日誌合併,備份namenode節點做用(並不是熱備份),secondarynamenode和namenode同時運行,通常來講都是運行在不一樣的機器上,namenode宕機,   secondarynamenode並不能立刻替換namenode提供服務。

  1.  輔助 NameNode,分擔其工做量。
  2. ​ 按期合併 fsimage和fsedits,並推送給NameNode。
  3. ​ 在緊急狀況下,可輔助恢復 NameNode。

 

(7)HDFS讀寫流程

Client端將數據寫入到HDFS

  1. 使用HDFS提供的客戶端Client, 向遠程的Namenode發起RPC請求
  2. Namenode會檢查要建立的文件是否已經存在,建立者是否有權限進行操做,成功則會爲文件建立一個記錄, 不然會讓客戶端拋出異常。Namenode建立一些元數據信息(datanode和數據塊的引用信息)
  3. 當客戶端開始寫入文件的時候, 客戶端會將文件切分紅多個packets, 並在內部以數據隊列「data queue( 數據隊列) 」的形式管理這些packets, 並向Namenode申請blocks, 獲取用來存儲replications的合適的datanode列表, 列表的大小根據Namenode中replication的設定而定
  4. 客戶端開始以pipeline( 管道) 的形式將packet寫入全部的replications中。 客戶端把packet以流的方式寫入第一個datanode, 該datanode把該packet存儲以後, 再將其傳遞給在此pipeline中的下一個datanode, 直到最後一個datanode, 這種寫數據的方式呈流水線的形式
  5. 最後一個datanode成功存儲以後會返回一個ack packet( 確認隊列) , 在pipeline裏傳遞至客戶端, 在客戶端的開發庫內部維護着」ack queue」, 成功收到datanode返回的ack packet後會從」ack queue」移除相應的packet
  6. 若是傳輸過程當中, 有某個datanode出現了故障, 那麼當前的pipeline會被關閉, 出現故障的datanode會從當前的pipeline中移除, 剩餘的block會繼續剩下的datanode中繼續以pipeline的形式傳輸, 同時Namenode會分配一個新的datanode, 保持replications設定的數量
  7. 客戶端完成數據的寫入後, 會對數據流調用close()方法, 關閉數據流
  8. 只要寫入了dfs.replication.min的複本數( 默認爲1),寫操做就會成功, 而且這個塊能夠在集羣中異步複製, 直到達到其目標複本數(replication的默認值爲3),由於namenode已經知道文件由哪些塊組成, 因此它在返回成功前只須要等待數據塊進行最小量的複製

客戶端讀取HDFS數據

  1. 使用HDFS提供的客戶端Client, 向遠程的Namenode發起RPC請求
  2. Namenode會視狀況返回文件的部分或者所有block列表, 對於每一個block, Namenode都會返回有該block拷貝的DataNode地址。(返回block信息)
  3. 客戶端Client會選取離客戶端最近的DataNode來讀取block; 若是客戶端自己就是DataNode, 那麼將從本地直接獲取數據
  4. 讀取完當前block的數據後, 關閉當前的DataNode連接, 併爲讀取下一個block尋找最佳的DataNode
  5. 當讀完列表block後, 且文件讀取尚未結束, 客戶端會繼續向Namenode獲取下一批的block列表
  6. 讀取完一個block都會進行checksum驗證, 若是讀取datanode時出現錯誤, 客戶端會通知Namenode, 而後再從下一個擁有該block拷貝的datanode繼續讀

 (8)Namenode結構

  在瞭解Namenode結構以前,咱們先看下存儲在namenode節點上的元數據信息。

  

  上圖的元數據信息描述爲有一個文件a.log,有三個備份,文件a.log分爲兩個數據塊,數據塊blk_一、blk_2,blk_1塊在{h0,h1,h3}三個datanode 上,blk_2在{h0,h2,h4}三個datanode上

   namenode在格式化以後,會在l臨時文件夾(hadoop.tmp.dir 設置,默認在/tmp/hadoop-${user.name})目錄下建立一個dfs目錄,以下:

  

 VERSION:是一個java properties文件,包含HDFS版本信息。

      namespaceID:文件系統的惟一標識(文件 首次格式化的時候建立,任何datanode註冊到namenode以前是不知道namespaceID這個值,以此能夠判斷鑑別新建的datanode)
      cTime:namenode存儲系統的建立時間。剛剛格式化的系統值爲0,文件系統升級以後,會更新到新的時間戳
      storageType:表示存儲目錄包含的是namenode仍是datanode
      layoutVersion:是一個負整數,表示持久性數據結構的版本。
 edits:編輯日誌文件。文件系統客戶端執行寫入或者修改操做的時候,這些操做首先被記錄到edits中,以後在namenode的內存也會維護這些元數據。是一個appendlog
 fsimage:是存儲文件元數據的鏡像文件,是一個永久性檢查點。
 fstime:最近一次checkpoint的時間
 
 namenode的元數據操做
    文件系統客戶端在執行寫操做或者修改操做的時候,首先記錄在namenode中edits日誌文件中,而後將元數據同步到namenode的內存中

一、Namenode始終在內存中保存metedata,用於處理「讀請求。當namenode啓動的時候,加載fsimage文件到內存,而且將editslog文件逐條加載到內存。而後生成新的空的editslog和新的數據最全的fsimage文件。

二、當客戶端進行讀寫操做時,首先將日誌記錄到editslog,而後將日誌加載到內存。

三、成功後,editslog同步到文件系統。

四、Fsimage是映像文件,是內存中元數據的checkpoint點,是一個序列化文件,不能在硬盤上直接修改。

 

SecondaryNameNode日誌合併(建立檢查點)

  當 edits文件的 大小和時間超過閥值,觸發checkpoint時
(1)secondarynamenode會請求namenode中止使用edits文件,建立一個新的日誌文件edits.new,將新的操做寫入到edits.new中
(2)secondarynamenode從namenode獲取edits和fsimage(經過http get)
(3)secondarynamenode將fsimage載入內存,並執行edits中的操做,生成新的fsimage文件fsimage.ckpt
(4)secondarynamenode將新的fsimage文件fsimage.ckpt發送給namenode(經過http post)
(5)namenode接收到新的fsimage文件 fsimage.ckpt,替換舊的fsimage文件,新的edits文件edits.new替換edits文件,同時更新fstime文件,記錄最新的checkpoint時間,fsimage更新了,這樣edits就不會愈來愈大
 
checkpoint配置
何時觸發secondarynamenode日誌合併?

在core-site.xml中配置fs.checkpoint.period 指定兩次checkpoint的最大時間間隔,默認3600秒。fs.checkpoint.size    規定edits文件的最大值,一旦超過這個值則強制checkpoint,無論是否到達最大時間間隔。默認大小是64M。

 

(9)Datanode結構

 DataNode職責:

  提供真實文件數據的存儲服務。

  文件塊(block):最基本的存儲單位。默認64M。(Hadoop2默認128MB)

         對於文件內容而言,一個文件的長度大小是size,那麼從文件的0偏移開始,按照固定的大小,順序對文件進行劃分並編號,劃分好的每個塊稱一個Block。HDFS默認Block大小是64MB,以一個256MB文 件,共有256/64=4個Block.

  不一樣於普通文件系統的是,HDFS中,若是一個文件小於一個數據塊的大小,並不佔用整個數據塊存儲空間。

  在Hadoop集羣中,默認是有三個副本(dfs.replication配置的是HDFS存儲時的備份數量),HDFS建立副本的策略通常是:

  • 第一塊:本地
  • 第二塊:同一機架上的不一樣機器
  • 第三塊:同一機房的不一樣機架上的機器

  若是備份的副本設置的更多,例如備份4個的話,可能第四塊在不一樣機房的機器上...

 datanode目錄結構

  

VERSION文件和namenode的VERSION文件差很少

  

  namespaceID是datanode首次訪問namenode時獲取的。

  storageID,對每一個datanode是惟一的,能夠根據這個屬性區分datanode  

blk_* :表示HDFS Block文件(原始的真實數據)
blk_*.meta : 表示對應blk_* Block文件的元數據。【datanode按期發送給namenode的元數據信息就是這些】

 

塊文件的目錄擴展

當目錄下的塊文件增長到必定的規模的時候,datanode會建立一個子目錄存儲塊文件和塊文件元數據。 dfs.datanode.numblocks屬性設置,控制超過多少數據時,建立子目錄存儲塊文件和元數據, dfs.data.dir屬性指定磁盤上的不一樣目錄,這樣數據塊以輪轉的方式(round-robin)寫到各個目錄中。(同一個datanode上的數據塊不會重複,只有不一樣datanode的數據塊纔可能會重複)
 
(10)安全模式
namenode啓動時,首先就將fsimage文件載入內存,並執行編輯日誌(edits)中的各項操做。一旦成功建立了元數據的映像,則會建立一個新的fsimage文件(不須要藉助secondarynamenode)和一個空的編輯日誌edits, 此時namenode監聽RPC和HTTP請求,可是namenode此時運行在安全模式下。在安全模式下,namenode文件系統對於客戶端是隻讀的 。(嚴格來說是訪問文件系統元數據的操做是確定執行的 ,例如展現文件系統目錄,對於讀文件操做,只有在集羣中datanode中的塊是可用時,才能夠讀取,可是對於修改操做,例如修改權限等都會失敗)
 
場景:
啓動一個剛剛格式化的HDFS集羣的時候,因爲文件系統中尚未塊,因此不會進入安全模式。
若是知足"最小副本條件",namenode會在30秒後退出安全模式(最小副本條件:指的是文件系統中99.9%的塊都知足最小副本級別)
最小副本級別:默認是1,dfs.replication.min屬性設置。
 
進入/退出安全模式
一、查看是否處於安全模式
hdfs dfsadmin -safemode get //hdfs dfsadmin是hdfs管理員命令

二、退出安全模式

在執行修改和寫入操做的時候,須要先退出安全模式

hdfs dfsadmin -safemode wait
#command to read or write
 
三、進入安全模式
在維護和升級集羣的時候很是關鍵,須要進入安全模式,防止在維護和升級期間的寫入和修改操做。
hdfs dfsadmin -safemode enter

四、 離開安全模式

hdfs dfsadmin -safemode leave

 安全模式的下屬性

屬性名稱 類型 默認值 說明
dfs.replication.min int 1 最小副本級別:成功執行寫操做的最小副本數目
dfs.safemode.threshold.pct float 0.999 最小副本條件:在namenode退出安全模式以前,知足最小副本級別的比例。設置高於1,永遠不會退出安全模式,設置爲0或者太小,可能會使得namenode沒法啓動安全模式
dfs.safemode.extention int 30 000 在知足最小副本條件以後,namenode還須要處於安全模式的時間(毫秒),對於小集羣來講,能夠設置爲0

 

 (11)HDFS 命令行

  HDFS有不少接口能夠和HDFS交互(java API等),命令行是最簡單的,也是入門學習須要瞭解的。

經常使用命令

  hadoop fs 和 hdfs dfs 均可以,可是推薦使用hdfs dfs 

  經過hadoop fs -help 查看

Usage: hadoop fs [generic options]
    [-appendToFile <localsrc> ... <dst>]
    [-cat [-ignoreCrc] <src> ...]
    [-checksum <src> ...]
    [-chgrp [-R] GROUP PATH...]
    [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
    [-chown [-R] [OWNER][:[GROUP]] PATH...]
    [-copyFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
    [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] <path> ...]
    [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
    [-createSnapshot <snapshotDir> [<snapshotName>]]
    [-deleteSnapshot <snapshotDir> <snapshotName>]
    [-df [-h] [<path> ...]]
    [-du [-s] [-h] [-x] <path> ...]
    [-expunge]
    [-find <path> ... <expression> ...]
    [-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-getfacl [-R] <path>]
    [-getfattr [-R] {-n name | -d} [-e en] <path>]
    [-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
    [-help [cmd ...]]
    [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...]]
    [-mkdir [-p] <path> ...]
    [-moveFromLocal <localsrc> ... <dst>]
    [-moveToLocal <src> <localdst>]
    [-mv <src> ... <dst>]
    [-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
    [-renameSnapshot <snapshotDir> <oldName> <newName>]
    [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
    [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
    [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
    [-setfattr {-n name [-v value] | -x name} <path>]
    [-setrep [-R] [-w] <rep> <path> ...]
    [-stat [format] <path> ...]
    [-tail [-f] <file>]
    [-test -[defsz] <path>]
    [-text [-ignoreCrc] <src> ...]
    [-touchz <path> ...]
    [-truncate [-w] <length> <path> ...]
    [-usage [cmd ...]]

 HDFS管理員命令

hdfs dfsadmin 

 

 可參照:https://blog.csdn.net/jjshouji/article/details/79087601

 

 筆摘主要是對HDFS理論的上的瞭解,具體的操做仍是須要多多實戰操做...

 

 參考:https://blog.csdn.net/dpengwang/article/details/79297435

    《Hadoop權威指南》

相關文章
相關標籤/搜索