一、HDFS概述
1、定義
HDFS(Hadoop Distributed File System),它是一個檔案系統,用于存盤檔案,通過目錄樹來定位檔案;其次,它是分布式的,由很多服務器聯合起來實作其功能,集群中的服務器有各自的角色,
HDFS的使用場景:適合一次寫入,多次讀出的場景,一個檔案經過創建、寫入和關閉之后就不需要改變,
2、優缺點
(1)優點:
- 高容錯性:資料自動保存多個副本,它通過增加副本的形式來提高容錯性,在某一個副本丟失后,它可以自動恢復,
- 適合處理大資料:資料規模可達到GB、TB、甚至PB級別的資料,檔案規模可達到百萬規模以上的數量
- 可構建在廉價機器上:通過多副本機制,提高可靠性
(2)缺點:
- 不適合低延時資料訪問:比如毫秒級的存盤資料,是做不到的
- 無法高效地對大量小檔案進行存盤:存盤大量小檔案的話,會占用NameNode大量的記憶體來存盤檔案目錄和塊資訊,這樣是不可取的,因為NameNode的記憶體總是有限的,小檔案存盤的尋址時間會超過讀取時間,違反了HDFS的設計目標
- 不支持并發寫入、檔案隨機修改:一個檔案只能有一個寫,不允許多個執行緒同時寫,僅支持資料append(追加),不支持檔案的隨機修改
3、組成架構

(1)NameNode(nn):就是master,他是一個管理者,
- 管理HDFS的名稱空間;
- 配置副本策略;
- 管理資料塊(Block)映射資訊;
- 處理客戶端讀寫請求
(2)DataNode:就是slave,NameNode下達命令,DataNode執行實際的操作,
- 存盤實際的資料塊;
- 執行資料塊的讀/寫操作
(3)Client:客戶端
- 檔案切分,檔案上傳HDFS的時候,Client將檔案切分成一個個的Block,然后進行上傳;
- 與NameNode互動,獲取檔案的位置資訊;
- 與DataNode互動,讀取或者寫入資料;
- Client提供一些命令來管理HDFS,比如NameNode格式化;
- Client可通過一些命令來訪問HDFS,比如對HDFS增刪改查操作
(4)Secondary NameNode:并非NameNode的熱備,當NameNode掛掉的時候,它并不能馬上替換NameNode并提夠服務,
- 輔助NameNode,分擔其作業量,比如定期合并Fsimage和Edits,并推送給NameNode;
- 在緊急情況下,可輔助恢復NameNode,--恢復一部分資料
4、檔案塊大小(面試重點)
HDFS中的檔案在物理上是分塊存盤(Block),塊的大小可通過配置引數來規定,默認大小在Hadoop2.x/3.x版本中是128M,1.x版本是64M,

HDFS塊的大小設定主要取決于磁盤傳輸速率:
- HDFS的塊設定太小,會增加尋址時間,程式一直在找塊的開始位置;
- 塊設定太大,從磁盤傳輸資料的時間會明顯大于定位這個塊 開始位置所需的時間,導致程式在處理這塊資料時,會非常慢
二、讀寫流程(面試重點)
1、寫資料

流程根據上圖總結如下:
(1)客戶端通過Distributed FileSystem模塊向NameNode請求上傳檔案,NameNode檢查目標檔案是否已存在,父目錄是否存在,
(2)NameNode回傳是否可以上傳,
(3)客戶端請求第一個 Block上傳到哪幾個DataNode服務器上,
(4)NameNode回傳3個DataNode節點,分別為dn1、dn2、dn3,
(5)客戶端通過FSDataOutputStream模塊請求dn1上傳資料,dn1收到請求會繼續呼叫dn2,然后dn2呼叫dn3,將這個通信管道建立完成,
(6)dn1、dn2、dn3逐級應答客戶端,
(7)客戶端開始往dn1上傳第一個Block(先從磁盤讀取資料放到一個本地記憶體快取),以Packet為單位,dn1收到一個Packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答佇列等待應答,
(8)當一個Block傳輸完成之后,客戶端再次請求NameNode上傳第二個Block的服務器,(重復執行3-7步),
在HDFS寫資料的程序中,NameNode會選擇距離待上傳資料最近距離的DataNode接收資料,那么這個最近距離怎么計算呢?節點距離:兩個節點到達最近的共同祖先的距離總和,
2、讀資料

(1)客戶端通過DistributedFileSystem向NameNode請求下載檔案,NameNode通過查詢元資料,找到檔案塊所在的DataNode地址,
(2)挑選一臺DataNode(就近原則,然后隨機)服務器,請求讀取資料,
(3)DataNode開始傳輸資料給客戶端(從磁盤里面讀取資料輸入流,以Packet為單位來做校驗),
(4)客戶端以Packet為單位接收,先在本地快取,然后寫入目標檔案,
三、作業機制
1、NameNode(NN)和Secondary NameNode(2NN)

(1)第一階段:NameNode啟動
- 第一次啟動NameNode格式化后,創建Fsimage和Edits檔案,如果不是第一次啟動,直接加載編輯日志和鏡像檔案到記憶體,
- 客戶端對元資料進行增刪改的請求,
- NameNode記錄操作日志,更新滾動日志,
- NameNode在記憶體中對元資料進行增刪改,
(2)第二階段:Secondary NameNode作業
- Secondary NameNode詢問NameNode是否需要CheckPoint,直接帶回NameNode是否檢查結果,
- Secondary NameNode請求執行CheckPoint,
- NameNode滾動正在寫的Edits日志,
- 將滾動前的編輯日志和鏡像檔案拷貝到Secondary NameNode,
- Secondary NameNode加載編輯日志和鏡像檔案到記憶體,并合并,
- 生成新的鏡像檔案fsimage.chkpoint,
- 拷貝fsimage.chkpoint到NameNode,
- NameNode將fsimage.chkpoint重新命名成fsimage,
其中,Fsimage檔案是指HDFS檔案系統元資料的一個永久性的檢查點,其中包含HDFS檔案系統的所有目錄和檔案inode的序列化資訊,Edits檔案是指存放HDFS檔案系統的所有更新操作的路徑,檔案系統客戶端執行的所有寫操作首先會被記錄到Edits檔案中,
每次NameNode啟動的時候都會將Fsimage檔案讀入記憶體,加載Edits里面的更新操作,保證記憶體中的元資料資訊是最新的、同步的,可以看成NameNode啟動的時候就將Fsimage和Edits檔案進行了合并,
2、DataNode(DN)

(1)一個資料塊在DataNode上以檔案形式存盤在磁盤上,包括兩個檔案,一個是資料本身,一個是元資料包括資料塊的長度,塊資料的校驗和,以及時間戳,
(2)DataNode啟動后向NameNode注冊,通過后,周期性(6小時)的向NameNode上報所有的塊資訊,(DN向NN匯報當前解讀資訊的時間間隔,默認6小時;DN掃描自己節點塊資訊串列的時間,默認6小時)
(3)心跳是每3秒一次,心跳回傳結果帶有NameNode給該DataNode的命令如復制塊資料到另一臺機器,或洗掉某個資料塊,如果超過10分鐘沒有收到某個DataNode的心跳,則認為該節點不可用,
(4)集群運行中可以安全加入和退出一些機器,
四、shell操作
啟動Hadoop集群:
$ sbin/start-dfs.sh
1、上傳
(1)-moveFromLocal:從本地剪切粘貼到HDFS
$hadoop fs -moveFromLocal ./shuguo.txt /sanguo
(2)-put:從本地檔案系統中拷貝檔案到HDFS路徑去
$ hadoop fs -put ./wuguo.txt /sanguo
(3)-appendToFile:追加一個檔案到已經存在的檔案末尾
$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo.txt
2、下載
(1)-get:從HDFS拷貝到本地
$ hadoop fs -get /sanguo/shuguo.txt ./shuguo2.txt
3、其他操作
(1)-ls: 顯示目錄資訊
$ hadoop fs -ls /sanguo
(2)-cat:顯示檔案內容
$ hadoop fs -cat /sanguo/shuguo.txt
(3)-chgrp、-chmod、-chown:Linux檔案系統中的用法一樣,修改檔案所屬權限
$ hadoop fs -chmod 666 /sanguo/shuguo.txt
$ hadoop fs -chown atguigu:atguigu /sanguo/shuguo.txt
(4)-mkdir:創建路徑
$ hadoop fs -mkdir /jinguo
(5)-cp:從HDFS的一個路徑拷貝到HDFS的另一個路徑
$ hadoop fs -cp /sanguo/shuguo.txt /jinguo
(6)-mv:在HDFS目錄中移動檔案
$ hadoop fs -mv /sanguo/wuguo.txt /jinguo
$ hadoop fs -mv /sanguo/weiguo.txt /jinguo
(7)-tail:顯示一個檔案的末尾1kb的資料
$ hadoop fs -tail /jinguo/shuguo.txt
(8)-rm:洗掉檔案或檔案夾
$ hadoop fs -rm /sanguo/shuguo.txt
(9)-rm -r:遞回洗掉目錄及目錄里面內容
$ hadoop fs -rm -r /sanguo
(10)-du統計檔案夾的大小資訊
$ hadoop fs -du -s -h /jinguo
27 81 /jinguo
$ hadoop fs -du -h /jinguo
14 42 /jinguo/shuguo.txt
7 21 /jinguo/weiguo.txt
6 18 /jinguo/wuguo.tx
說明:27表示檔案大小;81表示27*3個副本;/jinguo表示查看的目錄
(11)-setrep:設定HDFS中檔案的副本數量
這里設定的副本數只是記錄在NameNode的元資料中,是否真的會有這么多副本,還得看DataNode的數量,因為目前只有3臺設備,最多也就3個副本,只有節點數的增加到10臺時,副本數才能達到10,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293314.html
標籤:其他
上一篇:最近七天內連續三天活躍用戶數
