百度HDFS集群的數據壓縮實現大數據的儲存
當前,數字信息急劇膨脹。根據IDC的研究結果,2011年創造的信息數量達到1800EB, 每年產生的數字信息量還在以60%的速度高速增長,到 2020年,全球每年產生的數字信息將達到35ZB。面對海量數據處理的需求,“大數據”這一新的概念應運而生。關于大數據的定義,目前還沒有標準的說 法。
Hadoop Distributed File System,簡稱HDFS,是一個分布式文件系統。HDFS有著高容錯性(fault-tolerent)的特點,并且設計用來部署在低廉的(low- cost)硬件上。而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有著超大數據集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求(requirements)這樣可以實現流的形式訪問(streaming access)文件系統中的數據。HDFS開始是為開源的apache項目nutch的基礎結構而創建,HDFS是hadoop項目的一部分,而 hadoop又是lucene的一部分。
HDFS設計的針對對象主要適合流式訪問的超大文件、在使用便宜的硬件搭建的集群上運行。HDFS中Block的大小默認是64M,小于塊大小的的文件并不占據整個塊的全部空間(一個塊可能存有多個文件)。
在談到為什么使用百度HDFS集群的數據壓縮時,孫桂林表示,在存儲上帶來了靈活的可擴展性、高可用性、充分提高了存儲空間利用率。
使用Blocks的好處:
1) 可以存儲大文件,一個文件的大小可以大于任何一個單塊硬盤的容量
2) 把存儲單元抽象成塊而不是文件,簡化了存儲子系統:簡化了數據管理、取消元數據關注
3) 能很好適應數據復制,數據復制保證系統的容錯和可用性。
HDFS提供了兩種namenode的容錯機制:
1) 備份存儲持久化狀態的文件系統元數據的文件
2) 提供secondary namenode。Secondary的主要角色是合并namespace image和edit log,防止edit log過大。但是secondary namenode的數據較master namenode的數據有所延遲,所有數據恢復以后肯定會有數據丟失。
一般來講,冷數據和老數據經常會被壓縮,塊壓縮相對于文件壓縮的優勢在于三方面。第一,透明性,客戶端不需要知道壓縮的存在,也不需要知道升級。第二,靈活性,對實際壓縮的算法沒有限制。第三,本地性,不需要在跨數據節點的壓縮操作。
百度HDFS集群的數據壓縮
提到異步壓縮時,孫桂林表示,一個集群能從未壓縮的狀態變成壓縮狀態最多花費十天,如果壓縮的數據很繁瑣,我們可以通過處理器來減輕CPU的負載。
存儲壓縮的機制
DataNode數據已經壓縮了,Client可能不知道,DataNode 在響應Client的時候回將數據解壓。
Client 和DataNode之間可以通過壓縮的機制。整個通信協議需要一些擴展,需要告訴寫方,我們所需要壓縮的文件格式以及什么樣的編碼。在寫的操作上,存儲編碼和傳輸編碼不一樣,我們可以選擇是否壓縮儲存和傳輸編碼。在讀的操作上,支持一些協議來進行轉換。
為了節省帶寬,我們盡量避免DataNode 和DataNode之間重復壓縮的問題。在Append之前我們需要解壓最后的塊,還是解壓最后一兆數據。一旦文件被Append之后,表示這個文件的最 后一個塊不被壓縮。在壓縮的時候,首先我們需要選擇壓縮速率,相對而言解壓的速度更為關鍵。我們的目標是要實現節省存儲空間、避免壓縮影響計算作業,實時 壓縮透明。
如何處理小文件
1、 把小文件變成大文件(歸檔操作)
2、 把相同目錄下的小文件合成一個大文件。數據塊的大小可以達到一個數量級,可以做壓縮處理。
不同的集群,壓縮比部太一樣,壓縮比介于10%到50%之間,大部分的集群我們都可以獲取50%以上的空間收益。
未來,我們主推的是后臺異步壓縮,等待CPU空閑的時候,我們才會開始壓縮。壓縮過程和壓縮編碼完全透明,我們可以采用分級壓縮方法。對于冷數據,我們可以使用一些極致的壓縮算法,盡量來節省空間。通過一些歸檔操作,我們可以節省大量的磁盤空間。
很多時候,我們A模塊的輸出數據剛好是B模塊的輸入,我們可以提供一個塊共享的Quota Calculating ,我們可以通過塊共享的機制使用快速拷貝。
一個文件如果存在的時候,對于一些重復的塊文件該怎么處理,這將是我們未來的發展方向。