說 hadoop 是 append only 究竟是什麼意思?

有很多人說 hadoop 是 append only 的,但是稍微玩過 hdfs 後,大家也會知道,hdfs 中的檔案是可被刪改的,這麼說來,所謂的 append only 到底是什麼意思呢?


問:說 hadoop 是 append only,是因為 hdfs 是 append only 嗎?
沒錯。這裡說的 hadoop 其實就是指 hadoop 的底層檔案系統標準實作,也就是 hdfs。

問:但是 hdfs 中檔案是可以刪除的啊!你看,我們還有 hdfs dfs -rm 這種指令。
沒錯。hdfs 中的檔案是可以刪除的。

問:既然可以刪除,不就可以修改了嗎?
沒錯。他可以被修改。

問:但你還是堅持 hdfs 是 append only?
沒錯。


聽起來有點矛盾對吧?別忙著抓狂,其實話應該這麼說,hdfs 不是做不到修改這件事,而是考量到 hdfs 檔案系統的特性,「修改操作」極端沒有效率。

在 hdfs 中,如果我們企圖修改某檔案的一小部份,這就意味著要重寫整個檔案。假設您想在 1G 的檔案中修改十個英文字母,您需要重寫這整整 1G 的資料。而這是現實所無法接受的。因此,雖然技術上「修改資料」這件事並不是做不到,但卻不切實際,所以我們說 hdfs 是 append only 的--我們可以追加資料,但是不應該修改它

修改的實作方法

問題到這裡還沒完。對於某些建立在 hdfs 之上,看似可以修改,而且需要經常修改資料的系統,如 HBase 來說,他們很明顯就有修改資料的需求。這又是怎麼做的呢?

簡單來說,他們確實沒有修改資料。作為取代,他們不停地在檔案中添加新資料,並給每份資料附加一個遞增的類似時間戳的版本號。舊版本不被修改也依然存在於系統中,只是在一般使用中,被新版本的資料或刪除要求等等給 mask 掉。

這當然會消耗不少額外空間,不過另一方面,這也讓資料天生存在一個時序性記錄--用戶可以將追溯時光,退回到任何一個特定的時間點上,並重現資料的演進變化。這在大規模資料倉儲領域與分析中,都是很方便的。

參考