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客戶端操作資料
檔案的增刪改查