ログファイル保存のための圧縮とデータフォーマット

by Kalpak Shah, エンジニアリング・ディレクター

すべてのテクノロジー企業が、将来の処理のためにログを保存しています。簡単なアドバイスは、圧縮を使用して、ログが完全で誰でも使用できるようにすることです。しかし、これらのログファイルはどのような圧縮形式であるべきなのでしょうか?LZ0、Snappy、Gzip、Bzip2などの圧縮オプションや、テキスト、プロトコルバッファ、Avro、MessagePackなどのバイナリ形式、シーケンスファイル、RCFile、ORCFileなどのハイブリッド形式など、データを保存するための複数の形式があり、目まぐるしく変化しています。

ログファイルアプリケーション

ログファイルを使用することになるアプリケーションは、ログファイルアプリケーションと呼ばれます。現在、多くの企業がHadoop、NoSQL、Hiveなどの「ビッグデータ技術」を利用しています。そのため、ログファイルのフォーマットは、広く使用されるためには、過度な要求をせずに簡単な処理をサポートする必要があります。

圧縮

以下は、圧縮率と圧縮/解凍時間を比較したときに、異なる圧縮アルゴリズムがどのようにランク付けされているかを示すYahooの簡単なグラフです。

イメージ

ご覧の通り、高速な圧縮アルゴリズムほど圧縮率が悪くなっています。一度書き込まれ、何度も使用されるログファイルのストレージでは、ログファイルが分析やアプリケーションで使用されるたびに解凍時間がかかってしまいます。

また、Hadoopの場合は、保存されるログファイルが分割可能であることも要求されます。これは、複数のマッパーが同時に作業できるようにするためです。それでは、さまざまな圧縮アルゴリズムを見て、分割可能かどうかを確認してみましょう。

イメージ

ご覧の通り、bzip2だけが分割可能です。これは、すべてのログファイルをbzip2で圧縮しなければならないということでしょうか?bzip2は分割可能で、非常に高い圧縮率を持っていますが、その代償として、これらのログファイルを使用する必要のあるすべてのアプリケーションは、解凍のために非常に高いCPU時間を必要とすることになります。このCPU時間の問題を解決するために、.xzという拡張子でファイルをエンコードするLZMAアルゴリズムという新しいフォーマットが登場しました。Linux Kernelでは、.bzip2ではなく、.xzフォーマットが利用できるようになりました。LZMAはbzip2と同じような圧縮率で、しかも非常に高速です。

この問題は、bzip2があまり普及していないことと、.xvがさらに普及していないことです。アプリケーションは、これをサポートするコードを見つける必要があり、環境によっては問題になることがあります。

コンテナの形式

この他にも様々なフォーマットがありますが、以下に簡単にまとめてみました。

Hadoopでは、分割可能なバイナリ形式として、シーケンスファイル(およびマップファイル)を使用しています。主な使用例は、複数の小さなファイルをより大きなシーケンスファイルにクラブ化することです。Hive は RCFile と ORCFile を使用します。これらのフォーマットは、複数の行にまたがるクエリに最適化されています。これらのフォーマットは、行ごとにグループ化されており、内部は列指向のレイアウトになっています。圧縮は行グループの上に適用することができます。これらのフォーマットは、ログファイルを保存する主な用途が、Hive(またはその派生物)で分析を行う場合に最適です。

Protocol Buffers、Avro、MessagePackのような汎用のバイナリフォーマットは、バイナリのシリアライズ/デシリアライズフォーマットであり、確率的には単なるjson/textよりもはるかに効率的である。しかし、これらのバイナリフォーマットの多くは分割できないため、ログアプリケーションでは特別なサポートが必要となる。

テキストは最も一般的なフォーマットの一つです。ログファイルをテキストのままにしておいて、圧縮でスペースを有効にすることができます。

についてShareThis

ShareThis は、2007年以来、ソーシャルシェア、インタレスト、インテントのデータを統合することで、グローバルなデジタル行動の力を引き出してきました。300万以上のグローバルドメインにおける消費者の行動をもとに、ShareThis は、実際のデジタルデスティネーションにおける実際の人々の行動をリアルタイムに観察しています。

ニュースレターを購読する

最新のニュース、ヒント、アップデートを入手する

登録

関連コンテンツ