1. 程式人生 > >HDFS空間優化

HDFS空間優化

#1 HDFS存檔/歸檔
存檔是用來備份的時候標識用的,說白就是做個標記,表示這個文件在上次備份之後有沒有被修改過,比如當月1號,你給全盤做了一次備份,那麼所有的文件的存檔屬性都會被清除,表示備份過了。此後,如果你修改了某個檔案,那麼這個檔案的存檔屬性就會被加上。當幾天後,你再做“增量”備份時候,系統就會只備份那些具有“存檔”屬性的檔案。

每個檔案均按塊方式儲存,每個塊的元資料儲存在namenode的記憶體中,因此hadoop儲存小檔案會非常低效。因為大量的小檔案會耗盡namenode中的大部分記憶體(檔案大小為5kb,產生的元資料為150kb,得不償失)。一個1MB的檔案以大小為128MB的塊儲存,使用的是1MB的磁碟空間,而不是128MB。

Hadoop存檔檔案或HAR檔案,是一個更高效的檔案存檔工具,它將檔案存入HDFS塊,在減少namenode記憶體使用的同時,允許對檔案進行透明的訪問。具體說來,Hadoop存檔檔案可以用作MapReduce的輸入。

HDFS歸檔相當於把所有檔案歸檔在一個資料夾裡面了,該資料夾以.har命名的。

當有很多的小檔案時,可以通過歸檔來解決

【歸檔指令】

Hadoop archive–archiveName myhar.har –p /user/my /user/myhar
# -archiveName 指定歸檔檔名
# -p 指定要進行歸檔目錄的父目錄,支援同時歸檔多個子目錄
# /user/my    歸檔目錄
# /user/myhar 歸檔檔案存放的目錄

不足的地方:
1、archive檔案佔用與原檔案相同的硬碟空間;
2、archive檔案不支援壓縮;
3、archive一旦建立就不能進行修改;
4、archive雖然解決了namenode的空間問題,但是,在執行mapreduce時,會把多個小檔案交給同一個mapreduce去split,這會降低mapreduce的效率。

#2 降低副本數
1)首先停止所有節點,修改master節點的hdfs-site.xml檔案,設定dfs.relication值為目標值,舉個栗子預設為3,設定為2。然後啟動hadoop叢集。操作後會發現,新增檔案會按照新設定的副本數為執行,以前檔案的備份數仍是原來的值。即hadoop並不會自動的按照新的備份係數調整原來檔案的備份,需要手動完成。

2)手動完成以前檔案的備份數修改

執行命令: hadoop fs -setrep 2 /path 

#3 刪除無用資料
檢視HDFS檔案大小

hadoop fs -du -h /hive/warehouse

檢視HDFS檔案大小並排序

hadoop fs -du /hive/warehouse|sort -n

刪除資料

hadoop fs -rm <hdfs file>
hadoop fs -rm -r <hdfs dir>

#4 清理Trash回收站
和Linux系統的回收站設計一樣,HDFS會為每一個使用者建立一個回收站目錄:/user/使用者名稱/.Trash/,每一個被使用者通過Shell刪除的檔案/目錄,在系統回收站中都一個週期,也就是當系統回收站中的檔案/目錄在一段時間之後沒有被使用者回覆的話,HDFS就會自動的把這個檔案/目錄徹底刪除,之後,使用者就永遠也找不回這個檔案/目錄了。在HDFS內部的具體實現就是在NameNode中開啟了一個後臺執行緒Emptier,這個執行緒專門管理和監控系統回收站下面的所有檔案/目錄,對於已經超過生命週期的檔案/目錄,這個執行緒就會自動的刪除它們,不過這個管理的粒度很大。另外,使用者也可以手動清空回收站,清空回收站的操作和刪除普通的檔案目錄是一樣的,只不過HDFS會自動檢測這個檔案目錄是不是回收站,如果是,HDFS當然不會再把它放入使用者的回收站中了

根據上面的介紹,使用者通過命令列即HDFS的shell命令刪除某個檔案,這個檔案並沒有立刻從HDFS中刪除。相反,HDFS將這個檔案重新命名,並轉移到操作使用者的回收站目錄中(如/user/hdfs/.Trash/Current, 其中hdfs是操作的使用者名稱)。如果使用者的回收站中已經存在了使用者當前刪除的檔案/目錄,則HDFS會將這個當前被刪除的檔案/目錄重新命名,命名規則很簡單就是在這個被刪除的檔案/目錄名後面緊跟一個編號(從1開始知道沒有重名為止)。

當檔案還在/user/hdfs/.Trash/Current目錄時,該檔案可以被迅速地恢復。檔案在/user/hdfs/.Trash/Current中儲存的時間是可配置的,當超過這個時間,Namenode就會將該檔案從namespace中刪除。 檔案的刪除,也將釋放關聯該檔案的資料塊。注意到,在檔案被使用者刪除和HDFS空閒的增加之間會有一個等待時間延遲。

當被刪除的檔案還保留在/user/hdfs/.Trash/Current目錄中的時候,如果使用者想恢復這個檔案,可以檢索瀏覽/user/hdfs/.Trash/Current目錄並檢索該檔案。/user/hdfs/.Trash/Current目錄僅僅儲存被刪除 檔案的最近一次拷貝。/user/dfs/.Trash/Current目錄與其他檔案目錄沒有什麼不同,除了一點:HDFS在該目錄上應用了一個特殊的策略來自動刪除檔案,目前的預設策略是 刪除保留超過6小時的檔案,這個策略以後會定義成可配置的介面。

還有,NameNode是通過後臺執行緒(預設是org.apache.Hadoop.fs.TrashPolicyDefault.Emptier,也可以通過fs.trash.classname指定TrashPolicy類)來定時清空所有使用者回收站中的檔案/目錄的,它每隔interval分鐘就清空一次使用者回收站。具體的操作步驟是,先檢查使用者回收站目錄/user/使用者名稱/.Trash下的所有yyMMddHHmm形式的目錄,然後刪除壽命超過interval的目錄,最後將當前存放刪除的檔案/目錄的回收站目錄/user/使用者名稱/.Trash/current重新命名為一個/user/使用者名稱/.Trash/yyMMddHHmm.

從這個回收執行緒(Emptier)的實現可以看出,被使用者用命令刪除的檔案最多可在其回收站中儲存2*interval分鐘,最少可儲存interval分鐘,過了這個有效期,使用者刪除的檔案就永遠也不可能恢復了

#5 Balancer重新平衡

 hdfs balancer -threshold 10    #10為各節點儲存的浮動比例10%上下浮動

threshold後加上一個百分比,這個百分比代表datanode之間的使用差異小於這個值,我們便認為hdfs是平衡的.

在預設的情況下,balancer的過程是非常緩慢的.
Hadoop的開發人員在開發Balancer程式的時候,遵循了以下幾點原則:
1)在執行資料重分佈的過程中,必須保證資料不能出現丟失,不能改變資料的備份數,不能改變每一個rack中所具備的block數量。
2)系統管理員可以通過一條命令啟動資料重分佈程式或者停止資料重分佈程式。
3) Block在移動的過程中,不能暫用過多的資源,如網路頻寬。
4) 資料重分佈程式在執行的過程中,不能影響name node的正常工作。

Hadoop Balancer執行速度優化
1.修改dfs.datanode.max.transfer.threads = 4096 (如果執行hbase的話建議為16384),指定用於在DataNode間傳輸block資料的最大執行緒數,老版本的對應引數為dfs.datanode.max.xcievers

2.修改dfs.datanode.balance.bandwidthPerSec = 31457280 ,指定DataNode用於balancer的頻寬為30MB,這個示情況而定,如果交換機效能好點的,完全可以設定為50MB,單位是Byte,如果機器的網絡卡和交換機的頻寬有限,可以適當降低該速度,預設是1048576(1MB)

3.修改dfs.datanode.balance.max.concurrent.moves = 50,指定DataNode上同時用於balance待移動block的最大執行緒個數,這個值預設是5

4.如果配置沒生效或者不合理的話,Balancer會有如下警告資訊:

16/09/14 10:10:45 WARN balancer.Dispatcher: Failed to move blk_2056340845_2915024 with size=142227625 from 192.168.1.48:50010:DISK to 192.168.1.37:50010:DISK through 192.168.1.40:50010: Got error, status message opReplaceBlock BP-457606559-192.168.1.30-1258625319448:blk_2056340845_2915024 received exception java.io.IOException: Got error, status message Not able to copy block 1252320440 to /192.168.1.37:39630 because threads quota is exceeded., copy block BP-457606559-192.168.1.30-1258625319448:blk_2056340845_2915024 from /192.168.1.40:50010, block move is failed

5.執行balancer
su hdfs
hdfs dfsadmin -setBalancerBandwidth 104857600 #臨時設定頻寬
nohup hdfs balancer -threshold 10 & #10為各節點儲存的浮動比例10%上下浮動

6.Hadoop Balancer的步驟:
1、從namenode獲取datanode磁碟的使用情況
2、計算需要把哪些資料移動到哪些節點
3、分別移動,完成後刪除舊的block資訊
4、迴圈執行,直到達到平衡標準