見出し画像

LogstashのDissect filterとGrok filterの性能の比較

こんにちは!
Airitechのビッグデータ・AI活用グループのタンルインウーです。Elasticsearch、Kibanaを使ったデータの可視化や、データ分析用Logstashの設定やメンテナンスなどを担当しております。

先日、LogstashのCSV filterとGrok filterの性能について比較する記事を書きました。

今回は、その記事の続きで、Dissect filterを使った場合の性能も比較したいと思います。

Dissect filterとは

Dissect filterは、指定したパターンにより文字列を分解してfieldを抽出することができるfilterです。

Grok filterと似ていますが、Dissect filterは正規表現を使いません。正規表現を使うGrok filterほど複雑なことはできませんが、その代わり非常に高速に動作します。

Dissect filterの記載例

James,4321 Fifth Avenue,New York,87432
%{name},%{address},%{city},%{zip}

※ フィールドと区切り文字のセットは、dissectionと呼ばれます。
※ フィールドは、%{から}までのテキストです。
※ 区切り文字は、}文字と次の%{文字の間のテキストです。

これによって、元のメッセージから、以下のfieldを抽出することができます。

{
 "name": "James",
 "address": "4321 Fifth Avenue",
 "city": "New York"
 "zip": "87432"
}

※ キーは、%{と}の間のテキストです。(?、+、&)プレフィックスと序数のサフィックスは除きます。

スキップするfieldの指定(記号?を使う)や、抽出したfieldの結合(記号+を使う)など、もう少し複雑な操作も可能です。使い方については、詳しくは公式ドキュメントをご覧ください。

LogstashのDissectフィルターとGrokフィルターの性能の比較

同じデータをInputとして、Dissect filterとGrok filterの結果を比較しました。
スペース区切りのfield数が

● 5個の場合
● 10個の場合
● 20個の場合
● 20個だが、データの中に1%だけfield数が足りない不正なデータが混ざっている場合

の4つのパターンでそれぞれ計測しました。
(計測は、AWS のEC2インスタンス t3.medium で、Logstash7.12.0を用いました)

スペース区切りのfield数が5個の場合、データはこのような形になります。

aaaaaaaaaa bbbbbbbbbb cccccccccc dddddddddd eeeeeeeeee
dissect {
     mapping => {
       "message" => "%{field1} %{field2} %{field3} %{field4} %{field5}"
     }
 }

計測結果は以下の通りです。

画像1

Dissect filterは確かに速い!

公式ドキュメントに記載の通り、Dissect filterの方が速い結果となりました。

特に、field数が多い時にその差が顕著です。

秒間の処理件数が2倍以上違う場合もあるので、Dissect filterを使える場面では、Dissect filterを積極的に使った方が良いでしょう。

Dissect filter, Grok filter, CSV filterの使い分け

どの方法を使っても処理できる単純な形式のログの場合は、Dissect filterを使った方が速いことが分かりました。ログ変換の仕組みを実装するに当たっては、処理する対象のデータの性質によって使い分けるのがよいでしょう。

● 単純に区切り文字で分割するだけで、ログのフォーマットが行によって変わることはない
→Dissect filter

● 正規表現で指定する必要がある、複雑なフォーマットをしている
→Grok filter

● CSVやTSVのような単一の区切り文字で分割されるフォーマットで、引用符の有無や文字のエスケープを考慮する必要がある
→CSV filter

また、これらを組み合わせた処理にすることも考えられます。例えば、

「ログの全体をまずDissect filterで処理して、最後の部分はGrok filterで分解する」

といったやり方です。

Grok filterを使う場合は、以前の記事で紹介されている、性能問題を引き起こさない正規表現の書き方になるよう注意してください。

まとめ

Dissect filterは、公式ドキュメントに記載されている通り、高速です。Dissect filterが使える場面では積極的に使うようにしましょう。

Dissect filterだけでは処理できない場合は、処理する対象のデータの性質によって、Grok filterやCSV filterを使い分けましょう。

Airitechではビッグデータ解析ツール導入・支援のほか、トラブルシュートやシステム性能サービスなど、さまざまなサービスを提供しております。

UiPathユーザー向けElasticsearch・Kibanaのオンライントレーニングも行っています。Elasticsearch・Kibanaに興味のある方は、ぜひご参加ください。

Elasticsearch・Kibanaトレーニング(オンライン)

また、Elasticsearchエンジニアの募集も行っていますので興味のある方はぜひご応募ください。

Airitechの採用情報はこちら

ホームページ


この記事が気に入ったらサポートをしてみませんか?