1. 程式人生 > >Hadoop HDFS bug備忘:DN的刪除佇列與block report的協調引起的資料丟失

Hadoop HDFS bug備忘:DN的刪除佇列與block report的協調引起的資料丟失

現象描述:線上任務出現失敗,日誌中顯示查詢計算用的block失敗。

現象分析:NN記錄了block的所在的DN,但是DN上卻沒有了這個block;通常,刪除過程是先刪除NN\DN上的資料,然後再刪除磁碟上的資料。

肯定是某種條件,使得NN恢復了block資訊,而DN上的確刪除了block。經過分析發現,是兩個執行緒的協調,引入這個問題。

問題原因:NN下發刪除block命令到DN,DN先刪除自己cache中的block,然後將要刪除的block扔到刪除佇列中非同步刪除(a1,a2)。

                  而DN會每隔一定時間,report自己的block資訊給NN(b1,b2),以保持資料同步。如果這時候佇列中的沒有刪除乾淨,則仍然會收集過來。

                  掃描到的block會對DN的cache查缺補漏,同時使用DN cache的block資訊給NN,NN發現了多於副本數的block,會隨機刪除block。

                  如果頻繁這種情況發生,則會丟失資料。

觸發條件:檔案刪除不會引起上面的問題,因為檔案不存在了,相應的block就不存在了,彙報上來仍然會被NN刪除。單獨對block 的操作引起這個問題(如balance)。

bug修改:對於report執行緒,掃描結果直接彙報給NN(儲存在單獨的MAP中),那麼下次掃描時,真正丟失的block就會被複制回來