Uberは先日、Compressed Log Processor(CLP)を使ってログ処理のコストを 劇的に削減した方法を公開した。 CLPは、テキストログを可逆圧縮し、解凍せずに検索することができるツールである。 Uberのログデータに対して169倍の圧縮率を達成し、 ストレージ、メモリ、ディスク/ネットワーク帯域幅を節約することができた。
Uberは1日に25万件のSpark分析ジョブを実行し、1日に最大200TBのログを生成している。 これらのログは、Sparkを使用するプラットフォームエンジニアやデータサイエンティスト にとって非常に重要である。 ログを解析することで、アプリケーションの品質向上、障害や速度低下の トラブルシューティング、トレンドの分析、異常の監視などを行うことができる。 そのため、UberのSparkユーザーから、ログの保存期間を3日間から 1カ月間に延長してほしいという要望が頻繁に寄せられていた。 しかし、Uberが保存期間を1カ月にすると、HDFSのストレージコストが年間180Kドルから 180万ドルに増加してしまう。
その代わりにCLPを部分的に導入することで、Uberは保持期間を1カ月にした後、 ストレージコストを年間10Kドルにまで削減した。 著者のJack (Yu) Luo氏とDevesh Agrawal氏は、彼らの仕事を次のように説明している。
私たちは、CLPが完全な解凍をせずにログを検索する機能を維持しながら、 前例のない汎用圧縮機能の2倍の圧縮を実現するツールであることを見い出した。 CLPは通常、ファイルのバッチを一度に圧縮するように設計されるが、 私たちのロギングライブラリでは一度に1つのログファイルを書き込むため、 カスタマイズが必要だった。 具体的には、CLPのアルゴリズムを2つのフェーズに分割し、フェーズ1では 良い圧縮を実現しながら一度に一つずつのログファイルに圧縮する。 フェーズ2は、これらの圧縮されたファイルをCLPの最終フォーマットに集約する。
CLP圧縮を2つのフェーズに分割
出典:https://www.uber.com/en-DE/blog/reducing-logging-cost-by-two-orders-of-magnitude-using-clp/
Luo氏は、CLPを支える他の研究者、トロント大学およびYScopeのKirk Rodrigues氏と Ding Yuan氏とともに、研究論文でCLPについて説明している。
ElasticsearchやSplunk Enterpriseのような広く使われているログ検索ツールは、 高速な検索性能を提供するためにログをインデックス化するが、 インデックスのサイズは生のログサイズと同じ桁数以内である。 また、Gzipなどのログアーカイブ・圧縮ツールは高い圧縮率を実現するが、 アーカイブされたログの検索には、まずログの解凍が必要なため、時間がかかり、 大変な作業となってしまう。 これに対し、CLPは一般的に使用されている圧縮ツールよりも高い圧縮率を達成しながら、 ElasticsearchやSplunk Enterpriseと同等以上の高速な検索性能を実現する。 CLPの特長は、テキストログに含まれる膨大な量の繰り返しを捉えて、 ドメインごとに調整された圧縮・検索アルゴリズムを適用することにある。 これにより達成されたアーカイブされたログの検索と分析の効率化は、CLPなしではありえないものだ。
出典: https://www.uber.com/en-DE/blog/reducing-logging-cost-by-two-orders-of-magnitude-using-clp/
上図は、CLPが4つのステップでログメッセージを圧縮する方法を示している。 ステップ1では、CLPは決定論的にメッセージをタイムスタンプ、変数値のリスト、 およびログタイプに分解する。 ステップ2では、CLPはタイムスタンプと辞書にない変数をエンコードする。 ステップ3では、CLPは辞書を構築して繰り返し使われる変数の重複排除を実行する。 最後のステップ4で、CLPはログメッセージをタイムスタンプ、 変数値のリスト(変数辞書IDまたはエンコードされた非辞書値のいずれか)、 およびログタイプIDからなるエンコードメッセージテーブルに変換する。 多くのログメッセージがバッファリングされると、 各列はZstandardを使用して(列の順序で)圧縮される。
今後、UberのエンジニアはCLPのフェーズ2圧縮を導入し、 ストレージコストを2倍削減する予定である。 さらに、圧縮されたログをParquetなどの列指向ストレージフォーマットで保存し、 Prestoと統合してSQLクエリで圧縮されたログを解凍せずインタラクティブに検索することも計画している。