HDFS 讀資料流程
HDFS 寫資料流程
預設情況下每 64kb 一個 Packet
程式碼驗證:最開始會有一個輸出,也就是一個 64k 的檔案會輸出兩次。
@Test
public void testUploadPacket() throws IOException {
FileInputStream fis = new FileInputStream(new File("e://11.txt"));
FSDataOutputStream fos = fs.create(new Path("bbb.txt"), () -> System.out.println("每傳輸一個packet就會執行一次"));
IOUtils.copyBytes(fis,fos,new Configuration());
}
我們一般計算機儲存資料無非兩種方式:記憶體或磁碟。記憶體處理資料快,但斷電資料會丟失。磁碟資料處理慢,但是安全性高。
綜合以上兩點,NameNode 後設資料的管理採用的是:記憶體+磁碟(FsImage 檔案)的方式。
假設 1:如果要保持磁碟和後設資料資料一致,那麼對後設資料增刪改操作的時候,需要同步操作磁碟,這樣效率也不高。
假設 2:兩個資料合起來才是完整的資料。NameNode 引入了 edits 檔案(紀錄檔檔案,只能追加寫入),記錄增刪改操作。
具體流程如下:
1)第一階段:NameNode 啟動
2)第二階段:Secondary NameNode 工作
這兩個檔案位於${hadoop.tmp.dir}/dfs/name/current/下
1. Fsimage 檔案內容檢視
這些檔案本身開啟是亂碼不可檢視的,好在官方給我們提供了檢視這些檔案的命令。
語法:
hdfs oiv -p 檔案型別(xml) -i 映象檔案 -o 轉換後檔案輸出路徑
範例:
hdfs oiv -p XML -i fsimage_0000000000000000409 -o ./fsimage.xml
我們開啟 xml 檔案:
裡面包含了型別、檔名、副本數、許可權等等資訊。注意沒有儲存塊對應的 DataNode 的資訊。
因為這個節點資訊由 DataNode 自己彙報有哪些檔案,而不是檔案裡記錄屬於哪個節點。否則如果每個節點宕機了,那麼所有的檔案都需要進行變更資訊。
2. Edits 檔案內容
基本語法:
hdfs oev -p 檔案型別 -i編輯紀錄檔 -o 轉換後檔案輸出路徑
範例:
hdfs oev -p XML -i edits_inprogress_0000000000000000420 -o ./edits.xml
這個檔案記錄了我們的增刪改的一些操作。我們如何確認哪些 Edits 檔案沒有被合併過呢?
可以通過 fsimage 檔案自身的編號來確定。大於這個編號的 edits 檔案就是沒有合併的。
3. chekpoint 週期
週期設定我們可以在預設組態檔 hdfs-default.xml 裡找到。
<!-- 定時一小時 -->
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
<!-- 一分鐘檢查一次操作次數,當操作次數達到1百萬時,SecondaryNameNode執行一次 -->
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>操作動作次數</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60</value>
<description> 1分鐘檢查一次操作次數</description>
</property >
4. NameNode 故障處理
NameNode 儲存著所有的後設資料資訊,如果故障,整個 HDFS 叢集都無法正常工作。
如果後設資料出現丟失或損壞怎麼恢復呢?
1. HDFS 檔案限額設定
HDFS 檔案的限額設定允許我們以檔案的大小或檔案的個數來限制我們在某個目錄上傳的檔案數量或檔案大小。
#設定2個的數量限制,代表只能上傳一個檔案
hdfs dfsadmin -setQuota 2 /west
上傳第二個的時候報錯:
put: The NameSpace quota (directories and files) of directory /west is exceeded: quota=2 file count=3
清除數量限制
hdfs dfsadmin -clrQuota /west
#限定1k的空間
hdfs dfsadmin -setSpaceQuota 1k /west
# 清除限額
hdfs dfsadmin -clrSpaceQuota /west
#檢視限額
hdfs dfs -count -q -h /west
2. HDFS 的安全模式
安全模式是 HDFS 所處的一種特殊狀態,這種狀態下,檔案系統只能接受讀請求。
在 NameNode 主節點啟動時,HDFS 首先進入安全模式,DataNode 在啟動的時候會向 NameNode 彙報可用的 block 等狀態,當整個系統達到安全標準時,HDFS 自動離開安全模式。如果 HDFS 出於安全模式下,則檔案 block 不能進行任何的副本複製操作,因此達到最小的副本數量要求是基於 DataNode 啟動的狀態來判定的。啟動時不會再做任何複製,HDFS 叢集剛啟動的時候,預設 30S 的時間是處於安全期的,只有過了安全期,才可以對叢集進行操作。
#進入安全模式
hdfs dfsadmin -safemode enter
#離開安全模式
hdfs dfsadmin -safemode leave
3. Hadoop 歸檔技術
主要解決 HDFS 叢集存在大量小檔案的問題。由於大量小檔案佔用 NameNode 的記憶體,因此對於 HDFS 來說儲存大量小檔案造成 NameNode 記憶體資源的浪費。
Hadoop 存檔檔案 HAR 檔案,是一個更高效的檔案存檔工具,HAR 檔案是由一組檔案通過 archive 工具建立而來,在減少了 NameNode 的記憶體使用的同時,可以對檔案進行透明的存取,通俗來說就是 HAR 檔案對 NameNode 來說是一個檔案減少了記憶體的浪費,對於實際操作處理檔案依然是一個個獨立的檔案。
範例:
start-yarn.sh
hadoop archive -archiveName input.har -p /west /westAr
hadoop fs -lsr /user/root/output/input.har
hadoop fs -cp har:/// user/root/output/input.har/* /user/root