一软免、兩個(gè)主要的配置參數(shù):
fs.trash.interval
默認(rèn)值為:0(代表刪除的數(shù)據(jù)不進(jìn)入垃圾桶流礁,直接刪除)
單位:分鐘
描述:垃圾數(shù)據(jù)保存的時(shí)間
fs.trash.checkpoint.interval
默認(rèn)值為:0
單位:分鐘
描述:多久進(jìn)行一次垃圾清理和創(chuàng)建檢查點(diǎn)的檢測茸歧,默認(rèn)值為0,此時(shí)如果設(shè)置了 fs.trash.interval,則該值就會和 fs.trash.interval 的值保持一致,另外該值只能小于等于 fs.trash.interval 的值。
二、原理介紹:
NameNode在啟動的時(shí)候糠排,會創(chuàng)建一個(gè)專門用于垃圾回收的守護(hù)線程,該線程會根據(jù)參數(shù)fs.trash.checkpoint.interval 對應(yīng)的值周期性的從睡眠中蘇醒過來超升,執(zhí)行兩個(gè)主要的操作:
1)先執(zhí)行垃圾清理操作入宦,清理的原理是如下圖所示的目錄上面的數(shù)字代表的是垃圾檢查點(diǎn)創(chuàng)建的時(shí)間(yyMMddHHmmss),拿當(dāng)前時(shí)間減去該時(shí)間室琢,如果大于參數(shù)fs.trash.interval 設(shè)置的時(shí)間乾闰,則將該檢查點(diǎn)的數(shù)據(jù)遞歸的清理掉(其中Current目錄會被過濾掉),否者不操作盈滴。
2)使用當(dāng)前的時(shí)間將Current目錄重命名成日期目錄涯肩,作為之前一個(gè)fs.trash.checkpoint.interval 周期的數(shù)據(jù)的檢查點(diǎn)。
三、源碼分析:
1.在NameNode源碼中有如下代碼病苗,代表著啟動垃圾回收機(jī)制
? ? @Override
? ? public void startActiveServices() throws IOException {
? ? ? try {
? ? ? ? namesystem.startActiveServices();
????????startTrashEmptier(conf);
? ? ? } catch (Throwable t) {
? ? ? ? doImmediateShutdown(t);
? ? ? }
? ? }
2.下面是啟動垃圾排空方法的實(shí)現(xiàn)疗垛,
可以看出其創(chuàng)建了一個(gè)守護(hù)線程用于垃圾的清理,通過創(chuàng)建Trash對象铅乡,可以獲取到Emptier對象
3.可以看出Trash類繼承與Configured继谚,主要用于保存配置信息和垃圾策略對象。
4.從中可以看到垃圾都被放到了每個(gè)用戶的目錄下阵幸。
5.TrashPolicy類中的getInstance方法花履,
使用反射創(chuàng)建TrashPolicy對象,從源碼中也可以看到挚赊,我們也可以自己實(shí)現(xiàn)自己的垃圾回收策略诡壁,并通過在配置文件中使用key:fs.trash.classname指定為自己的實(shí)現(xiàn)的類,來使用自己的垃圾回收策略荠割。系統(tǒng)默認(rèn)實(shí)現(xiàn)的垃圾回收策略類是:TrashPolicyDefault
6.之后調(diào)用TrashPolicyDefault的初始化方法妹卿,
其中最開始處的兩個(gè)參數(shù)就在此時(shí)獲取其對應(yīng)的值的,并且會創(chuàng)建一些常量用于回收時(shí)進(jìn)行路徑和時(shí)間的判斷的蔑鹦。
7.創(chuàng)建完TrashPolicyDefault之后夺克,NameNode就會調(diào)用getEmptier方法獲取一個(gè)Emptier對象,用于垃圾的真正的清理嚎朽。
Emptier類是類TrashPolicyDefault的內(nèi)部類铺纽,因此,該類能訪問類TrashPolicyDefault中的很多成員變量哟忍,另外類Emptier是Runnable的子類狡门,也是垃圾回收線程真正執(zhí)行的類,從類Emptier的構(gòu)造方法中可以看出開頭介紹的參數(shù) fs.trash.checkpoint.interval 的值必須要小于等于 fs.trash.interval 的值锅很。
8.之后NameNode會調(diào)用this.emptier.start(); (在步驟2中可以看到)方法將線程啟動其馏,之后就開始執(zhí)行類Emptier中的run方法:
從中可以看出,當(dāng)NameNode程序啟動后爆安,其會根據(jù)排空間隔時(shí)間讓線程進(jìn)行休眠叛复,當(dāng)線程蘇醒之后,就開始執(zhí)行刪除操作和創(chuàng)建檢查點(diǎn)操作扔仓。
9.垃圾刪除操作真正執(zhí)行的方法致扯,刪除策略:
1)Current目錄下的垃圾不刪除。
2)是日期目錄的当辐,將日期目錄轉(zhuǎn)換成對應(yīng)的時(shí)間的毫秒值,之后讓當(dāng)前時(shí)間減去上面的值鲤看,判斷是否超過了配置的刪除時(shí)間缘揪,如果超過,就執(zhí)行遞歸的刪除操作。
10. 創(chuàng)建檢查點(diǎn)的方法找筝,
即創(chuàng)建上面刪除事需要使用的日期目錄方法蹈垢,該方法將當(dāng)前時(shí)間轉(zhuǎn)換成 yyMMddHHmmss 格式日期,并創(chuàng)建對應(yīng)的Path對象袖裕,之后使用rename方法將Current目錄重命名成上面的日期目錄曹抬,用于下次執(zhí)行時(shí)判斷是否需要?jiǎng)h除垃圾數(shù)據(jù)的依據(jù)。