hadoop的HDFS詳解

一、HDFS的shell(命令行客戶端)操作

常用命令參數介紹
-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的數量>

二、hdfs的工作機制

1、概述

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

2、HDFS寫數據的流程

2.1、概述

客戶端要向HDFS寫數據,首先要跟namenode通信以確認可以寫文件并獲得接收文件block的datanode,然后,客戶端按順序將文件逐個block傳遞給相應datanode,并由接收到block的datanode負責向其他datanode復制block的副本。

2.2、詳細流程圖

2.2、詳細步驟解析

1、客戶端有一個文件cls.avi,300M,客戶端向namenode請求上傳文件/aaa/cls.avi,namenode查詢元數據,元數據要檢查一下看有沒有/aaa這個目錄,沒有就不讓傳,假設條件滿足(有/aaa這個目錄)
2、元數據就給客戶端一個響應,說可以上傳
3、rpc請求上傳第一個block(0-128M),請返回哪幾臺datanode可以上傳(namenode記錄了這個集群里有哪些datanode,哪些在線,哪些已經死掉了,每一臺datanode空間的大小,這是因為每一個datanode定期向namenode匯報它的信息)
4、假設返回dn1、dn3、dn4這3個datanode。考慮的因素有:空間、距離
客戶端說要返回幾個dn就返回幾個dn
上傳datanode的選擇策略是:
第一個副本:先考慮跟客戶端距離最近的,距離指的是客戶端到datanode之間網絡跳轉的極速,如果在同一個機架(路由器)下面,它們的距離基本上是一樣的,那這個時候就考慮空間,如果空間也都一樣的話,那就隨機了。
第二個副本:再考慮跨機架選擇一個datanode增加副本的可靠性,因為副本主要是用來考慮安全的,如果在同一個機架上,如果機架斷電,那么就都找不到了。
第三個副本:就在第一個副本同機架挑選另外一個datanode存放

一般公司1個機架就搞定了,幾十臺機器

5、客戶端向datanode傳數據流,在傳之間要先建管道。先跟目標機器(dn1)請求建立一個通道channel,告訴dn1要傳數據,同時還要傳給dn3和dn4,dn1請求dn3建立一個通道,dn3請求dn4建立一個通道。

client---請求建立通道---->dn1----請求建立通道--->dn3---請求建立通道--------->dn4
                                                                          |                                                                                         |                                                                         |
|                                                                         |
|                                                                         |
|<-----應答成功------dn1<------應答成功-------dn3<------應答成功(準備好了)----                                      
6、管道建成之后開始傳輸,從客戶端開始讀文件(0-128M),然后向datanode里面寫的,并不是把128M傳到dn1成功了才往dn3、dn4復制的,而是以一個一個的小數據包(packet,一個packet有64k)為單位來寫,先寫進dn1的緩沖區,然后一邊向dn1的block1的存儲區寫,一邊向dn3的緩沖區復制,dn3的緩沖區一邊向dn3的block1的存儲區寫,一邊向dn4的緩沖區寫,這樣,block1的三個副本幾乎同時傳完。
7、每一個packet都有應答,上傳成功了就返回上傳成功了。block只要dn1上傳成功了客戶端就認為上傳成功了,如果dn3、dn4沒上傳成功的話,沒有關系,namenode最后會做異步的同步,會將dn1上面的block于dn3、dn4進行同步。如果dn1上傳失敗的話,就向namenode請求,說datanode1不行,請求再換一個datanode,這之后namenode就會幾下datanode1這臺機器有問題。

8、接下來客戶端上傳第二個block,這個時候會再次請求namenode,讓namenode返回三個datanode,按照上面的原則再選。

9、namenode就記下了這個文件上傳到哪個目錄,上傳了幾個block,每個block的每個副本都在哪個dn上。當客戶端讀的時候就能夠返回這些信息

3、HDFS讀數據的流程

3.1 概述

客戶端將要讀取的文件路徑發送給namenode,namenode獲取文件的元信息(主要是block的存放位置信息)返回給客戶端,客戶端根據返回的信息找到相應datanode逐個獲取文件的block并在客戶端本地進行數據追加合并從而獲得整個文件

3.2、詳細步驟圖

3.3、詳細步驟解析

1、客戶端跟namenode通信查詢文件元數據,namenode返回要查詢的文件的元數據信息(知道這個文件有幾個block,分別在哪里,比如說文件有三個block)
2、根據返回的元數據信息,找到找到第一個block所在的datanode服務器
3、挑選一臺datanode(就近原則,然后隨機)服務器,請求讀取數據
4、建立通道,傳輸數據(datanode是向通道里面拉取數據,客戶端是向通道里面讀取數據的)
5、第一個block傳輸完之后,按照上面的流程獲取第二個block
6、獲取到第二個block之后,將第二個block塊追加到第一個block的末尾
7、再獲取第三個block追加到文件的末尾,這樣整個文件就獲取到了

三、namenode的工作機制

1、namenode的職責

NAMENODE職責:
負責客戶端請求的響應
元數據的管理(查詢,修改)

2、元數據管理

每隔一段時間,會由secondary namenode將namenode上積累的所有edits和一個最新的fsimage下載到本地,并加載到內存進行merge(這個過程稱為checkpoint)
日志文件是滾動的,一個正在寫的,幾個已經寫好滾動的,checkpoint時把正在寫的滾動一下,然后把fsimage和日志文件下載到secondary namenode機器,只有第一次才會下載fsimage,這時fsimage不會很大,以后就只下載日志文件



元數據信息首先存在內存里面,如果內存里存滿的話, 定時dump到fsimage(整個內存里面元數據的鏡像文件),內存里面所有的數據在fsimage里面都有,其實就是序列化到fsimage

當有元數據信息進行更新的時候,首先先在內存里面更新,然后在edits里面記錄操作日志,這樣即便當前的namenode掛了,也能通過操作日志和fsimage(里面存的是老數據)來得到全新的數據。
如果edits運行久了,里面就會有非常多的操作日志了,這樣每次啟動的時候加載edits就會加載很長時間,會啟動的特別慢,這個時候怎么做呢,將edits和fsimage定期的合并,形成新的fsimage,這樣遺留的edits日志就會非常的少。
1、secondary namenode和namenode之間會進行心跳通信,secondary namenode會向namenode請求是否要做checkpoint,當條件滿足(比如,設置的定時時間達到了,或者edits里面日志的數量達到了),2、會請求做checkpoint,當執行了checkpoint 3、namenode滾動當前正在寫的edits 4、然后將所有的日志文件,包括剛剛滾動出來的日志文件和fsimage下載到secondary namenode 
5、在secondary namenode上將日志文件和fsimage加載到secondary namenode的內存合并成更新后的元數據,6、將元數據dump成新的fsimage.chkpoint文件 7、將fsimage.chkpoint文件上傳到namenode 8、將fsimage.chkpoint文件重命名成fsimage 9、當第二次再執行checkpoint的時候,只把edits文件下載到secondary namenode就行了(因為secondary namenode已經有fsimage文件了,namenode上的fsimage還是secondary namenode傳過去的),這時候將edits和fsimage.chkpoint合并成最新的元數據信息,dump成fsimage.chkpoint,上傳到namenode就行了。
edits和fsimage盡可能的追上內存中的數據


namenode對數據的管理采用了三種存儲形式:
內存元數據(NameSystem)
磁盤元數據鏡像文件
數據操作日志文件(可通過日志運算出元數據)

1

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之間最大的操作記錄

2.1、

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容