hadoop--02(hdfs詳解)
1.HDFS的概念和特性
首先,它是一個檔案系統,用於儲存檔案,通過統一的名稱空間——目錄樹來定位檔案其次,它是分散式的,由很多伺服器聯合起來實現其功能,叢集中的伺服器有各自的角色;
重要特性如下:
- HDFS中的檔案在物理上是分塊儲存(block),塊的大小可以通過配置引數( dfs.blocksize)來規定,預設大小在hadoop2.x版本中是128M,老版本中是64M
- HDFS檔案系統會給客戶端提供一個統一的抽象目錄樹,客戶端通過路徑來訪問檔案,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
- 目錄結構及檔案分塊資訊
- 檔案的各個block的儲存管理由datanode節點承擔,datanode是HDFS叢集從節點,每一個block都可以在多個datanode上儲存多個副本(副本數量也可以通過引數設定dfs.replication)
- HDFS是設計成適應一次寫入,多次讀出的場景,且不支援檔案的修改
(注:適合用來做資料分析,並不適合用來做網盤應用,因為,不便修改,延遲大,網路開銷大,成本太高
2.常用命令引數介紹
-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檔案系統中的用法一樣,對檔案所屬許可權 示例: hadoop 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.HDFS原理篇
- HDFS叢集分為兩大角色:NameNode、DataNode
- NameNode負責管理整個檔案系統的元資料
- DataNode 負責管理使用者的檔案資料塊
- 檔案會按照固定的大小(blocksize)切成若干塊後分布式儲存在若干臺datanode上
- 每一個檔案塊可以有多個副本,並存放在不同的datanode上
- Datanode會定期向Namenode彙報自身所儲存的檔案block資訊,而namenode則會負責保持檔案的副本數量
- HDFS的內部工作機制對客戶端保持透明,客戶端請求訪問HDFS都是通過向namenode申請來進行
1.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的伺服器。
2. HDFS讀資料流程:
客戶端將要讀取的檔案路徑傳送給namenode,namenode獲取檔案的元資訊(主要是block的存放位置資訊)返回給客戶端,客戶端根據返回的資訊找到相應datanode逐個獲取檔案的block並在客戶端本地進行資料追加合併從而獲得整個檔案
1、跟namenode通訊查詢元資料,找到檔案塊所在的datanode伺服器
2、挑選一臺datanode(就近原則,然後隨機)伺服器,請求建立socket流
3、datanode開始傳送資料(從磁盤裡面讀取資料放入流,以packet為單位來做校驗)
4、客戶端以packet為單位接收,現在本地快取,然後寫入目標檔案
3.NAMENODE工作機制:
學習目標:理解namenode的工作機制尤其是元資料管理機制,以增強對HDFS工作原理的理解,及培養hadoop叢集運營中“效能調優”、“namenode”故障問題的分析解決能力
NAMENODE職責:負責客戶端請求的響應。元資料的管理(查詢,修改)
元資料管理:namenode對資料的管理採用了三種儲存形式:
記憶體元資料(NameSystem) 元資料存放在記憶體這樣才高效,
磁碟元資料映象檔案 其次要有備份才安全,所以在namenode節點所對應的磁碟上有相應的備份
資料操作日誌檔案(可通過日誌運算出元資料) ,但是如果記憶體中一有資料變動就跟新到磁碟效率必然很低,所以需要弄個操作日誌檔案
元資料儲存機制:
A、記憶體中有一份完整的元資料(記憶體meta data)
B、磁碟有一個“準完整”的元資料映象(fsimage)檔案(在namenode的工作目錄中)
C、用於銜接記憶體metadata和持久化元資料映象fsimage之間的操作日誌(edits檔案)注:當客戶端對hdfs中的檔案進行新增或者修改操作,操作記錄首先被記入edits日誌檔案中,當客戶端操作成功後,相應的元資料會更新到記憶體meta.data中
元資料的checkpoint:每隔一段時間,會由secondary namenode將namenode上積累的所有edits和一個最新的fsimage下載到本地,並載入到記憶體進行merge(這個過程稱為checkpoint),checkpoint的作用:namenode和secondary namenode的工作目錄儲存結構完全相同,所以,當namenode故障退出需要重新恢復時,可以從secondary namenode的工作目錄中將fsimage拷貝到namenode的工作目錄,以恢復namenode的元資料。
4.DATANODE的工作機制:Datanode工作職責:儲存管理使用者的檔案塊資料定期向namenode彙報自身所持有的block資訊(通過心跳資訊上報)這點很重要,因為,當叢集中發生某些block副本失效時,叢集如何恢復block初始副本數量的問題)
5.HDFS的java操作:hdfs在生產應用中主要是客戶端的開發,其核心步驟是從hdfs提供的api中構造一個HDFS的訪問客戶端物件,然後通過該客戶端物件操作(增刪改查)HDFS上的檔案
具體實現見文件大資料離線計算2
接下來檢視hdfs的目錄樹:首先需要給linux安裝tree命令:
yum install gcc
yum install gcc-c++
# 下載
wget http://mama.indstate.edu/users/ice/tree/src/tree-1.7.0.tgz
tar zxvf tree-1.7.0.tgz
cd tree-1.7.0
make
cp tree /bin
給linux安裝telnet命令:
Sudo yum install xinetd
yum install telnet
yum install telnet-server
查詢hdfs下的資料夾hadoop fs –ls /
建立hdfs下的資料夾 hadoop fs -mkdir /test
問題:沒有找到主機路由:
防火牆沒有關的原因:
檢視防火牆是否開啟:sudo service iptables status
關閉防火牆:sudo service iptables stop
刪除檔案系統根目錄下的檔案:
hadoop fs -rmr /a.txt
建立資料夾:
hadoop fs -mkdir -p /aaa/bbb
用tree命令檢視hdfs的樹結構:
檢視檔案的大小:
案例:沒有name ,嘗試從SecondaryNameNode恢復資料
把name幹掉:rm –rf name
再把namenode的程序殺掉:
Hadoop不能運行了:
嘗試恢復:SecondaryNameNode裡面有的才能恢復,沒有就不能恢復
更安全的做法是讓edits操作日誌寫到多個磁碟上去 namenode的工作目錄
配置檔案:
檢視叢集的狀態:
hdfs dfsadmin –report