卡爾派克·沙阿,工程總監
現在,每個技術公司都在存儲日誌以供將來處理。簡單的建議是使用壓縮並確保日誌是完整的和可供每個人使用。但是,這些日誌檔應該採用什麼壓縮格式?壓縮選項範圍令人困惑 - LZ0、Snappy、Gzip、Bzip2 等,以及可存儲數據的多種格式 — 文本、二進位格式(如協定緩衝區、Avro、MessagePack 等)以及混合格式(如序列檔、RCFile、ORCFile 等)。
紀錄檔案應用程式
將使用日誌檔的任何應用程式稱為日誌檔應用程式。許多公司現在都在使用"大數據技術",如 Hadoop、NoSQL、Hive 等。因此,日誌檔格式應支援輕鬆處理,無需任何不當要求即可廣泛使用它們。
壓縮
下面是雅虎的一個快速圖表,介紹不同的壓縮演演演算法在壓縮比與壓縮/解壓縮時間的排名。
正如您所看到的,更快的壓縮演演演算法具有較差的壓縮比率。對於日誌檔存儲(編寫一次,然後多次使用),每次日誌檔用於分析時,或由任何應用程式進行解壓縮時間。
通常針對 Hadoop 顯示的另一個要求是儲存的日誌檔需要可拆分。這樣,多個映射器可以同時處理它。讓我們來看看不同的壓縮演演演算法,看看它們是否可拆分:
如您所見,只有 bzip2 是可拆分的。這是否意味著我們應該使用 bzip2 壓縮所有紀錄檔?它是可拆分的,並且具有非常高的壓縮率,但權衡是,每個需要使用這些日誌檔的應用程式也將具有解壓縮所需的非常高的 CPU 時間。為了抵消高 CPU 時間要求,有一種新的格式可用 - LZMA 演演演算法 - 編碼在 .xz 擴展名中的檔。Linux 內核現在提供 .xz 格式,而不是 .bzip2。LZMA 的壓縮比與 bzip2 相似,而且速度也非常快。
問題在於 bzip2 不是很受歡迎,.xv 更少。應用程式需要找到代碼來支援這種情況,這可能會有問題,具體取決於您的環境。
容器格式
有一些其他格式,將出現在您的研究中,下面是快速總結他們。
Hadoop 使用序列檔(和地圖檔)進行二進位格式,該格式是可拆分的。主要用例是將多個較小的文件合併到較大的序列檔中。蜂巢同時使用 RCFile 和 ORCFile。這些格式經過優化,可用於跨多個行進行查詢。它們都由行分組,並且內部具有列佈局。壓縮可以應用於行組的頂部。如果您存儲日誌檔的主要用例是在 Hive(或其衍生物)中進行分析,則這些格式是偉大的。
通用二進位格式,如協定緩衝區、Avro 和 MessagePack 是二進位序序列化/反序列化格式,並且比純 json/文本效率更高。但是,大多數二進位格式不可拆分,它們需要在日誌應用程式中提供專門的支援。
文本是最流行的格式之一。我們可以將日誌檔保留在文本中,讓壓縮處理使其空間高效。