文章中記錄了問題發現和解決的程序,單純為了解決問題的伙伴請到最后一段,
目錄
發現問題
什么是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+,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/189604.html
標籤:其他
