1. 程式人生 > >Hadoop之HDFS詳解

Hadoop之HDFS詳解

1、HDFS的概念和特性
  它是一個檔案系統,其次是分散式的
  重要特性:
    1).HDFS中的檔案在物理上是分塊儲存(block),新版預設128M
    2).客戶端通過路徑來訪問檔案,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
    3).目錄結構及檔案分塊資訊(元資料)的管理由namenode節點承擔
    4).檔案的各個block的儲存管理由datanode節點承擔
    5).HDFS是設計成適應一次寫入,多次讀出的場景,且不支援檔案的修改

  (注:適合用來做資料分析,並不適合用來做網盤應用,因為,不便修改,延遲大,網路開銷大,成本太高)


2、HDFS基本操作篇


  客戶端使用 :hadoop fs -ls /
  1、hdfs命令列客戶端的命令引數
    [-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] <localsrc> ... <dst>]
    [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-count [-q] <path> ...]
    [-cp [-f] [-p] <src> ... <dst>]
    [-createSnapshot <snapshotDir> [<snapshotName>]]
    [-deleteSnapshot <snapshotDir> <snapshotName>]
    [-df [-h] [<path> ...]]
    [-du [-s] [-h] <path> ...]
    [-expunge]
    [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-getfacl [-R] <path>]
    [-getmerge [-nl] <src> <localdst>]
    [-help [cmd ...]]
    [-ls [-d] [-h] [-R] [<path> ...]]
    [-mkdir [-p] <path> ...]
    [-moveFromLocal <localsrc> ... <dst>]
    [-moveToLocal <src> <localdst>]
    [-mv <src> ... <dst>]
    [-put [-f] [-p] <localsrc> ... <dst>]
    [-renameSnapshot <snapshotDir> <oldName> <newName>]
    [-rm [-f] [-r|-R] [-skipTrash] <src> ...]
    [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
    [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
    [-setrep [-R] [-w] <rep> <path> ...]
    [-stat [format] <path> ...]
    [-tail [-f] <file>]
    [-test -[defsz] <path>]
    [-text [-ignoreCrc] <src> ...]
    [-touchz <path> ...]
    [-usage [cmd ...]]

  引數介紹:
    -help
      功能:輸出這個命令引數手冊
    -ls
      功能:顯示目錄資訊
      示例: hadoop fs -ls hdfs://hadoop-server01:9000/
      備註:這些引數中,所有的hdfs路徑都可以簡寫
      -->hadoop fs -ls / 等同於上一條命令的效果
    -mkdir
      功能:在hdfs上建立目錄
      示例:hadoop fs -mkdir -p /aaa/bbb/cc/dd
    -moveFromLocal
      功能:從本地剪下貼上到hdfs
      示例:hadoop fs - moveFromLocal /home/hadoop/a.txt /aaa/bbb/cc/dd
    -moveToLocal
      功能:從hdfs剪下貼上到本地
      示例:hadoop fs - moveToLocal /aaa/bbb/cc/dd /home/hadoop/a.txt
    -appendToFile
      功能:追加一個檔案到已經存在的檔案末尾
      示例:hadoop fs -appendToFile ./hello.txt hdfs://hadoop-server01:9000/hello.txt
      可以簡寫為:
      Hadoop fs -appendToFile ./hello.txt /hello.txt
    -cat
      功能:顯示檔案內容
      示例:hadoop fs -cat /hello.txt
    -tail
      功能:顯示一個檔案的末尾
      示例:hadoop fs -tail /weblog/access_log.1
    -text
      功能:以字元形式列印一個檔案的內容
      示例:hadoop fs -text /weblog/access_log.1
    -chgrp
    -chmod
    -chown
      功能:linux檔案系統中的用法一樣,對檔案所屬許可權
      示例:
        adoop fs -chmod 666 /hello.txt
        hadoop fs -chown someuser:somegrp /hello.txt
    -copyFromLocal
      功能:從本地檔案系統中拷貝檔案到hdfs路徑去
      示例:hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/
    -copyToLocal
      功能:從hdfs拷貝到本地
      示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz
    -cp
      功能:從hdfs的一個路徑拷貝hdfs的另一個路徑
      示例: hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
    -mv
      功能:在hdfs目錄中移動檔案
      示例: hadoop fs -mv /aaa/jdk.tar.gz /
    -get
      功能:等同於copyToLocal,就是從hdfs下載檔案到本地
      示例:hadoop fs -get /aaa/jdk.tar.gz
    -getmerge
      功能:合併下載多個檔案
      示例:比如hdfs的目錄 /aaa/下有多個檔案:log.1, log.2,log.3,...
      hadoop fs -getmerge /aaa/log.* ./log.sum
    -put
      功能:等同於copyFromLocal
      示例:hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
    -rm
      功能:刪除檔案或資料夾
      示例:hadoop fs -rm -r /aaa/bbb/
    -rmdir
      功能:刪除空目錄
      示例:hadoop fs -rmdir /aaa/bbb/ccc
    -df
      功能:統計檔案系統的可用空間資訊
      示例:hadoop fs -df -h /
    -du
      功能:統計資料夾的大小資訊
      示例:
        hadoop fs -du -s -h /aaa/*
    -count
      功能:統計一個指定目錄下的檔案節點數量
      示例:hadoop fs -count /aaa/
    -setrep
      功能:設定hdfs中檔案的副本數量
      示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz
      <這裡設定的副本數只是記錄在namenode的元資料中,是否真的會有這麼多副本,還得看datanode的數量>


3、概述
  1. HDFS叢集分為兩大角色:NameNode、DataNode
  2. NameNode負責管理整個檔案系統的元資料
  3. DataNode 負責管理使用者的檔案資料塊
  4. 檔案會按照固定的大小(blocksize)切成若干塊後分布式儲存在若干臺datanode上
  5. 每一個檔案塊可以有多個副本,並存放在不同的datanode上
  6. Datanode會定期向Namenode彙報自身所儲存的檔案block資訊,而namenode則會負責保持檔案的副本數量
  7. HDFS的內部工作機制對客戶端保持透明,客戶端請求訪問HDFS都是通過向namenode申請來進行

4、HDFS寫資料流程
  客戶端要向HDFS寫資料,首先要跟namenode通訊以確認可以寫檔案並獲得接收檔案block的datanode,
  然後,客戶端按順序將檔案逐個block傳遞給相應datanode,並由接收到block的datanode負責向
  其他datanode複製block的副本

  詳細步驟解析:
    1、根namenode通訊請求上傳檔案,namenode檢查目標檔案是否已存在,父目錄是否存在
    2、namenode返回是否可以上傳
    3、client請求第一個 block該傳輸到哪些datanode伺服器上
    4、namenode返回3個datanode伺服器ABC
    5、client請求3臺dn中的一臺A上傳資料(本質上是一個RPC呼叫,建立pipeline),A收到請求會繼續呼叫B,然後B呼叫C,將真個pipeline建立完成,逐級返回客戶端
    6、client開始往A上傳第一個block(先從磁碟讀取資料放到一個本地記憶體快取),以packet為單位,A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答佇列等待應答
    7、當一個block傳輸完成之後,client再次請求namenode上傳第二個block的伺服器。

5、HDFS讀資料流程
  客戶端將要讀取的檔案路徑傳送給namenode,namenode獲取檔案的元資訊(主要是block的存放位置資訊)
  返回給客戶端,客戶端根據返回的資訊找到相應datanode逐個獲取檔案的block並在客戶端
  本地進行資料追加合併從而獲得整個檔案

  詳細步驟解析
    1、跟namenode通訊查詢元資料,找到檔案塊所在的datanode伺服器
    2、挑選一臺datanode(就近原則,然後隨機)伺服器,請求建立socket流
    3、datanode開始傳送資料(從磁盤裡面讀取資料放入流,以packet為單位來做校驗)
    4、客戶端以packet為單位接收,現在本地快取,然後寫入目標檔案


6、Namenode的工作機制
  1、NAMENODE職責
    負責客戶端請求的響應
    元資料的管理(查詢,修改)

  2、元資料管理
    namenode對資料的管理採用了三種儲存形式:
    記憶體元資料(NameSystem)
    磁碟元資料映象檔案
    資料操作日誌檔案(可通過日誌運算出元資料)

  3、元資料儲存機制
    A、記憶體中有一份完整的元資料(記憶體meta data)
    B、磁碟有一個“準完整”的元資料映象(fsimage)檔案(在namenode的工作目錄中)
    C、用於銜接記憶體metadata和持久化元資料映象fsimage之間的操作日誌(edits檔案)注:當客戶端對hdfs中的檔案進行新增或者修改操作,操作記錄首先被記入edits日誌檔案中,當客戶端操作成功後,相應的元資料會更新到記憶體meta.data中


  4、元資料的checkpoint
    每隔一段時間,會由secondary namenode將namenode上積累的所有edits和一個最新的fsimage下載到本地,
    並載入到記憶體進行merge(這個過程稱為checkpoint)

    checkpoint操作的觸發條件配置引數
      dfs.namenode.checkpoint.check.period=60 #檢查觸發條件是否滿足的頻率,60秒
      dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary
      #以上兩個引數做checkpoint操作時,secondary namenode的本地工作目錄
      dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir}

      dfs.namenode.checkpoint.max-retries=3 #最大重試次數
      dfs.namenode.checkpoint.period=3600 #兩次checkpoint之間的時間間隔3600秒
      dfs.namenode.checkpoint.txns=1000000 #兩次checkpoint之間最大的操作記錄

  checkpoint的附帶作用
    namenode和secondary namenode的工作目錄儲存結構完全相同,所以,當namenode故障退出需要
    重新恢復時,可以從secondary namenode的工作目錄中將fsimage拷貝到namenode的工作目錄,
    以恢復namenode的元資料

7、DataNode的工作機制
  1、Datanode工作職責:
    儲存管理使用者的檔案塊資料
    定期向namenode彙報自身所持有的block資訊(通過心跳資訊上報)
    (這點很重要,因為,當叢集中發生某些block副本失效時,叢集如何恢復block初始副本數量的問題)


  2、Datanode掉線判斷時限引數
    datanode程序死亡或者網路故障造成datanode無法與namenode通訊,namenode不會立即把該節點判定為死亡,
    要經過一段時間,這段時間暫稱作超時時長。HDFS預設的超時時長為10分鐘+30秒。如果定義超時時間為timeout
    ,則超時時長的計算公式為:
    timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval。

8、HDFS的java操作
    hdfs在生產應用中主要是客戶端的開發,其核心步驟是從hdfs提供的api中構造一個HDFS的訪問客戶端物件,
  然後通過該客戶端物件操作(增刪改查)HDFS上的檔案

  window下開發的說明
  建議在linux下進行hadoop應用的開發,不會存在相容性問題。如在window上做客戶端應用開發,需要設定以下環境:
    A、在windows的某個目錄下解壓一個hadoop的安裝包
    B、將安裝包下的lib和bin目錄用對應windows版本平臺編譯的本地庫替換
    C、在window系統中配置HADOOP_HOME指向你解壓的安裝包
    D、在windows系統的path變數中加入hadoop的bin目錄


  8.1 獲取api中的客戶物件
    如果我們的程式碼中沒有指定fs.defaultFS,並且工程classpath下也沒有給定相應的配置,conf中的預設值
    就來自於hadoop的jar包中的core-default.xml,預設值為: file:///,則獲取的將不是
    一個DistributedFileSystem的例項,而是一個本地檔案系統的客戶端物件

  8.2 HDFS客戶端操作資料
    檔案的增刪改查