記一次HDFS空間清理:Non DFS Used

2020-10-25 07:01:07

文章中記錄了問題發現和解決的過程,單純為了解決問題的夥伴請到最後一段。

目錄

發現問題

什麼是Non DFS Used

解決


發現問題

入職到公司後,維護叢集時有一項日常不是很頻繁的任務就是清理叢集資料。我們公司的Hadoop(CDH 5.x)叢集大概不到50臺的樣子,總DN容量在450T左右。這個資料量對於大的網際網路公司可能不算什麼,但我之前一直也沒遇到過如此多的資料,百T級別的容量都要清理空間,感覺公司的資料量實在是龐大。

但隨著入職時間的增加,在進行日常運維的時候發現了一些不太合乎邏輯的問題。比如我們看到的告警資訊如下

機器的總容量是7.8T,已經使用的空間是4T,但空間部分居然是黃色的告警標識。進入該DN後發現了問題

告警中提示可用空間只有1T了。以我二十多年10以內加減法的經驗,這裡肯定有什麼環節出了問題。於是登入這臺機器,通過Linux,命令檢視實際情況。

[root@hostname ~]# df -lh
檔案系統                容量   已用  可用    已用% 掛載點
/dev/sde               1.1T  658G  388G   63% /u04
/dev/sdc               1.1T  647G  398G   62% /u02
/dev/sdb               1.1T  658G  387G   63% /u01
/dev/sda               1.1T  649G  396G   63% /data
/dev/sdd               1.1T  658G  387G   63% /u03
/dev/sdg               2.2T  553G  1.7T   25% /u05

為了能看得更清楚,我把其他非資料磁碟的資訊刪除掉了。這臺機器有6塊盤,最後一塊2.2T的是因為一直報空間不足擴容新增的。從這些資訊來看

已用空間 = 658 + 647 + 658 + 649 + 658 + 553 = 3823 G ≈ 4T

總空間= 1.1 * 5 + 2.2 = 7.7 T

linux檢視的資訊同第一張圖片CDH機器資訊中截圖的資料基本是吻合的。我們所剩的空間應該還剩下3.7T左右,但叢集的告警也不應該是無故出來的,剩下的2.7T去哪了呢。只能去檢視DataNode的資訊

到一臺機器上執行hdfs dfsadmin -report可以列舉出所有的DataNode的資訊。這臺機器的報告資訊如下,同樣去掉了一些無用資料

Name: IP:50010 (機器名)
Hostname: 機器名
Configured Capacity: 8241232003072 (7.50 TB)
DFS Used: 4066627752645 (3.70 TB)
Non DFS Used: 3020135345763 (2.75 TB)
DFS Remaining: 1154468904664 (1.05 TB)

可以看到,這個Non DFS Used的空間跟我們丟掉的空間是基本吻合的。那這個Non DFS Used是什麼呢?

什麼是Non DFS Used

從名字上來看,應該是"不是HDFS使用的空間",我們知道HDFS是建立在伺服器檔案系統之上的虛擬檔案系統,也就是說伺服器的磁碟HDFS可以使用,那其他程式同樣可以使用。我們在HDFS中設定了資料盤是/u01 ~ /u05, 那這五塊盤中其他程式儲存檔案所佔用的空間應該就是Non DFS Used。

後邊的地址詳細的講解了什麼是Non DFS Used,感興趣的同學可以閱讀。什麼是Non DFS Used

值得一提的是,文章中指出的Non DFS Used 公式中

Non DFS used = ( Total Disk Space - Reserved Space) - Remaining Space - DFS Used

這裡的Reserved Space指的是設定項(dfs.datanode.du.reserved)所設定的內容,是HDFS自己預留的,一般為30G,這30G是不算在Non DFS Used中的。但應用程式在HDFS資料盤預留的空間都要歸類到Non DFS Used的空間中。(此處為個人粗淺理解)

我們公司叢集設定的是10G,截圖如下

排除是該值設定過大。

言歸正傳,叢集的這個告警會是其他應用程式佔用資料磁碟導致的嗎?經過我實際檢視,資料磁碟上除了HDFS的檔案,並沒有其他內容。

所以導致Non DFS Used 過高的還另有原因。

解決

經過我堅持不懈的努(bai)力(du),終於發現了這麼一篇文章Reserved RBW space is not released if client terminates while writing block

文章的大概內容是: 在使用者端向HDFS寫入資料時,首先要將自己需要的空間保留住,防止自己寫著寫著空間不足了。這些被保留的空間會隨著資料的寫入慢慢釋放掉。但是,如果在寫入的過程中,寫入程式被中斷了,那這些被保留的空間只能等到DN被重新啟動後才會釋放。

我們叢集每天在跑的azkaban任務有幾千個,每天都會有任務因為各種原因失敗重跑或者直接kill。我覺得上邊這個應該就是Non DFS Used過高的根本原因了。So~ 挑一臺機器重新啟動試試,測試結果是Non DFS Used從2.7T+變成了300G+,重新啟動有效。

PS : 重新啟動後要等一段時間再執行report命令檢視。讓子彈飛一會。

因為告警的機器還是挺多的,所以選擇捲動重新啟動。那最終我會為叢集釋放多少空間出來呢?

[hdfs@hostname ~]$ hdfs dfsadmin -report > hdfs_report
[hdfs@hostname ~]$ cat hdfs_report | grep Non | awk 'BEGIN{sum=0}{sum+=$4}END{print sum}'
92336932414662

 大概是90T,按照京東上磁碟的價錢,這一波為公司省下了14w+。