big data入門に見せかけたfluentd入門

137
Big Data入門に見せかけた Fluentd入門 June 5 th , 2013 Authored by Keisuke Takahashi (a.k.a. @keithseahus)

Upload: keisuke-takahashi

Post on 19-Jun-2015

25.394 views

Category:

Technology


0 download

DESCRIPTION

2013年7月5日、社内勉強会で使用した資料です(一部修正済み)。 ライセンスはクリエイティブ・コモンズ・ゼロとします。ご自由にお使い下さい。 ソースのPowerPointファイルはこちら => http://bit.ly/begining_fluentd_learning_big_data fluent-plugin-glusterfsはこちら => https://github.com/keithseahus/fluent-plugin-glusterfs

TRANSCRIPT

Page 1: Big Data入門に見せかけたFluentd入門

Big  Data入門に見せかけたFluentd入門

June  5th,  2013  Authored  by  Keisuke  Takahashi  (a.k.a.  @keithseahus)

Page 2: Big Data入門に見せかけたFluentd入門

• ご案内  – このドキュメントの想定読者層  

•  Big  DataやFluentdのプロでない方。Big  Data関連の仕事をしていない方や、Fluentdに触ったことが無い方。  

•  Fluentdが注目される理由を、背景から理解したい方。  •  Fluentdの開発者向け公式ドキュメント(現行)が日本語に翻訳されたら本気を出そ

うと思っているソフトウェア開発者。  

– 間違いに気づいたら…  •  著者にそっとご連絡頂けると嬉しいです。ベストエフォートで直します。  

– ライセンスについて  •  クリエイティブ・コモンズ・ゼロです。再利用にあたって、著者の表示を削除するこ

とを含め、著作権上の制約は一切ありません。居住地における法規及び国際法の範囲内で、ご自由にお使い下さい。  

– 免責  •  本ドキュメントにより生じた一切の事象について、著者は一切の責任を負わないも

のとします。

Page 3: Big Data入門に見せかけたFluentd入門

Big  Data  is  何?

各自がBig Dataの定義を持っており、唯一の正しい定義というものは無いはずです。みなさんはどう捉えていますか?

Page 4: Big Data入門に見せかけたFluentd入門

多くの文献が、Gartnerの発表を引用しています。

Page 5: Big Data入門に見せかけたFluentd入門

多くの文献が、Gartnerの発表を引用しています。

Page 6: Big Data入門に見せかけたFluentd入門

データの容量(volume)  データの種類(variety)  

データが増加する速度(velocity)  それぞれが飛躍的に増大するため  

活用することが難しいと考えられていたデータ

ここでは、これをベースに話を進めます。

Page 7: Big Data入門に見せかけたFluentd入門

ビジネス面での課題

Page 8: Big Data入門に見せかけたFluentd入門

データの容量  -­‐  volume  -­‐

Page 9: Big Data入門に見せかけたFluentd入門

IDCによれば、世界のデータ量は、2015年には7.9ゼタバイトまで増大するとのことです。

Page 10: Big Data入門に見せかけたFluentd入門

データの種類  -­‐  variety  -­‐

Page 11: Big Data入門に見せかけたFluentd入門

ユーザはインターネット上の多様なサービスを利用してデータを生成し、サービスもまた増え続けています。

Page 12: Big Data入門に見せかけたFluentd入門

データを生成するのは人間だけではありません。デバイスが生成するデータもあります。

Page 13: Big Data入門に見せかけたFluentd入門

Webサイトのマウストラッキングデータも活用可能なデータです。

Page 14: Big Data入門に見せかけたFluentd入門

データの解像度も増えています。

Page 15: Big Data入門に見せかけたFluentd入門

データが増加する速度  -­‐  velocity  -­‐

Page 16: Big Data入門に見せかけたFluentd入門

モバイルで常時接続の高速インターネットが可能になり、ユーザが膨大なデータをインプット・アウトプットできる時代になりました。

Page 17: Big Data入門に見せかけたFluentd入門

近距離無線やセンサーデバイスが発達し、データを生成しインターネットへ出力する主体は、飛躍的に増加しています。

Page 18: Big Data入門に見せかけたFluentd入門

結果、データは加速度的に増加し、データの総量は指数関数的に増加しています。

Page 19: Big Data入門に見せかけたFluentd入門

技術によるアプローチ

容量・種類・速度の課題に対する、技術的なアプローチを見てみましょう。

Page 20: Big Data入門に見せかけたFluentd入門

大量データの検索を  高速化するための技術  

volumeに対するアプローチです。

Page 21: Big Data入門に見せかけたFluentd入門

• インメモリデータベース  • 列指向データベース  • 超並列データベース  • ハイブリッド型データベース

HBase, Hypertable, Cloudataなどは列指向データベースにカテゴライズされます。

Page 22: Big Data入門に見せかけたFluentd入門

大量データの取扱いを  簡易にするための技術  

varietyに対するアプローチです。

Page 23: Big Data入門に見せかけたFluentd入門

• キーバリューストア  • ドキュメント指向データベース  • グラフデータベース

例えばKVSはCassandra, Kyoto Cabinet, Couchbase, Redis, Riak、ドキュメント指向DBはMongoDB, CouchDB、グラフDBはNeo4jが有名です。

Page 24: Big Data入門に見せかけたFluentd入門

大量データの処理を  高速化するための技術  

velocityに対するアプローチです。

Page 25: Big Data入門に見せかけたFluentd入門

• 並列分散処理  • 複合イベント処理  • イベントストリーム処理

並列分散処理はHadoopのMapReduceが有名。データを蓄積せずに、流れるデータに対して解析処理をかける技術もあります。

Page 26: Big Data入門に見せかけたFluentd入門

何が変わるのか?

Page 27: Big Data入門に見せかけたFluentd入門

分析手法

Page 28: Big Data入門に見せかけたFluentd入門

従来のデータ分析 Big  Dataの分析

生成元 企業の基幹システム アクセスログ  ソーシャルデータ  センサー  ...

構造 構造化データ 半構造化データ  非構造化データ  

保管方式 リレーショナルデータベース  データウェアハウス

分散ストレージ  キーバリューストア  ...

分析手法 定型レポート データマイニング

視覚化 ビジネスインテリジェンス ビジネスインテリジェンス

分析の対象が質的にも量的にも異なるため、従来とは異なるアプローチで分析する必要があります。

Page 29: Big Data入門に見せかけたFluentd入門

従来のデータ分析 Big  Dataの分析

生成元 企業の基幹システム アクセスログ  ソーシャルデータ  センサー  ...

構造 構造化データ 半構造化データ  非構造化データ  

保管方式 リレーショナルデータベース  データウェアハウス

分散ストレージ  キーバリューストア  ...

分析手法 定型レポート データマイニング

視覚化 ビジネスインテリジェンス ビジネスインテリジェンス

まさにゴミの山から宝物を探すような分析になります。データマイニングについて少し深堀りしましょう。

Page 30: Big Data入門に見せかけたFluentd入門

データサイエンティストと呼ばれる人たちが、統計的手法を用いてBig Dataの分析を行います。そのため、統計分析が可能な形にBig Dataをクレンジングする必要があります。

Page 31: Big Data入門に見せかけたFluentd入門

Big  Data  活用までの道のり

Big Dataが活用されるまでのシーケンスを追ってみましょう。

Page 32: Big Data入門に見せかけたFluentd入門

• 監視やレポート(ゴール)  

Big Data活用のゴールは、主に監視やその予測に役立てたり、ビジネスを先見するレポートを出力することです。

Page 33: Big Data入門に見せかけたFluentd入門

• 監視やレポート(ゴール)  • データマイニングと可視化  

予測や予見など、未来を推し量ることができるのは、統計分析を行うためです。

Page 34: Big Data入門に見せかけたFluentd入門

• 監視やレポート(ゴール)  • データマイニングと可視化  • 蓄積と処理  

基本的に、材料となるデータはストレージに蓄積します。それらに対して、データマイニングが可能となるよう、必要な処理を行います。

Page 35: Big Data入門に見せかけたFluentd入門

• 監視やレポート(ゴール)  • データマイニングと可視化  • 蓄積と処理  

• データの生成

蓄積されるデータは、世界中の不特定な場所で常に生成されています。

Page 36: Big Data入門に見せかけたFluentd入門

• 監視やレポート(ゴール)  • データマイニングと可視化  • 蓄積と処理  • ???  • データの生成

重要なシーケンスが一つ抜けています。何でしょう?

Page 37: Big Data入門に見せかけたFluentd入門

データ収集

不特定の場所で生成されるデータを集め、ストレージへと集約する処理です。

Page 38: Big Data入門に見せかけたFluentd入門

従来

従来のデータ分析での収集方法を見てみましょう。ここではログデータを例にします。

Page 39: Big Data入門に見せかけたFluentd入門

最もポピュラーなデータ収集方法は、syslogではないでしょうか。

Page 40: Big Data入門に見せかけたFluentd入門

問題点

従来的な手法であるsyslogををBig Dataに対しても使用することは、無理があります。なぜでしょう?

Page 41: Big Data入門に見せかけたFluentd入門

構造の観点で、データには大きく2つに分類されます。統計分析を行うためには、データは構造化されている必要があります。

Page 42: Big Data入門に見せかけたFluentd入門

ログは  非構造化データ  

である  (Big  Data解析の観点から)

各種ログにも構造はありますが、それはアプリケーションごとに異なる独自の構造で、そのまま集約して分析することはできません。

Page 43: Big Data入門に見せかけたFluentd入門

Big Data時代には様々なイベントログが分析対象となります。従来のログ同様、これらは非構造化データです。

Page 44: Big Data入門に見せかけたFluentd入門

分析をするためには  構造化処理が必要  

Page 45: Big Data入門に見せかけたFluentd入門

ログを構造化  するには?

非構造化データを構造化データに変換するためには、どうすればよいでしょう?

Page 46: Big Data入門に見せかけたFluentd入門

世の中には、さまざまな非構造化データがあります。

Page 47: Big Data入門に見せかけたFluentd入門

バラバラな  フォーマットを  

共通化

これらを、構造化データに変換するためには、まずフォーマットを統一する必要があります。

Page 48: Big Data入門に見せかけたFluentd入門

共通の  フォーマット?

そのフォーマットの要件は何でしょう?

Page 49: Big Data入門に見せかけたFluentd入門

 ASCIIである  

現在のBig Data分析の対象は、バイナリではなくASCIIデータです。

Page 50: Big Data入門に見せかけたFluentd入門

 ASCIIである   値の意味が明示的である  

数値やテキストだけがあっても分析できません。それが何の値なのか、システムにとって明示的である必要があります。

Page 51: Big Data入門に見せかけたFluentd入門

 ASCIIである   値の意味が明示的である   柔軟である

データの種類は不特定です。スキーマレスであることが必要です。

Page 52: Big Data入門に見せかけたFluentd入門

それ何て     ?

※まぁ、     でもいいですけど…

Page 53: Big Data入門に見せかけたFluentd入門

そんなログコレクタ

不特定多数の非構造化データを収集し、構造化データに変換する、ログコレクタがあります。

Page 54: Big Data入門に見せかけたFluentd入門
Page 55: Big Data入門に見せかけたFluentd入門

他のログコレクタ  との比較

ログコレクタは他にもあります。比較してみましょう。

Page 56: Big Data入門に見せかけたFluentd入門

Scribe

Page 57: Big Data入門に見せかけたFluentd入門
Page 58: Big Data入門に見せかけたFluentd入門

Flume

Page 59: Big Data入門に見せかけたFluentd入門
Page 60: Big Data入門に見せかけたFluentd入門

Fluentd

Page 61: Big Data入門に見せかけたFluentd入門

設定は後述のincludeディレクティブで、HTTPでコンフィグのURLを指定して読み込むことができ、これで一元管理が可能です。

Page 62: Big Data入門に見せかけたFluentd入門

そんなログコレクタ

重要なことなので2回言います。

Page 63: Big Data入門に見せかけたFluentd入門

重要なことなので2回言います。

Page 64: Big Data入門に見せかけたFluentd入門

Log  everything  in  JSON.

Page 65: Big Data入門に見せかけたFluentd入門

Sponsored  by

Page 66: Big Data入門に見せかけたFluentd入門

ちなみに、Treasure Dataは、Fluentdを使用してBig Dataソリューションを展開する注目のベンチャーです。

Page 67: Big Data入門に見せかけたFluentd入門

先ほど、Fluentdのメリットを挙げました。

Page 68: Big Data入門に見せかけたFluentd入門

これらの特徴について、詳しく追ってみましょう。

Page 69: Big Data入門に見せかけたFluentd入門

インストール

インストールが容易という特徴です。

Page 70: Big Data入門に見せかけたFluentd入門

  の環境が  ある場合

Page 71: Big Data入門に見せかけたFluentd入門
Page 72: Big Data入門に見せかけたFluentd入門

  の環境が  無い場合

Rubyがインストールされていなくても、Fluentdは利用可能です。

Page 73: Big Data入門に見せかけたFluentd入門

td-­‐agent

td-agentをインストールします。

Page 74: Big Data入門に見せかけたFluentd入門

td-agentのインストールも、非常に簡単です。

Page 75: Big Data入門に見せかけたFluentd入門

gem版はtrunkに近い、所謂オープンソース版。  td-­‐agentの方が十分テストされているとのこと。

一応、留意点です。

Page 76: Big Data入門に見せかけたFluentd入門

gem版とtd-­‐agentとで  標準プラグインの種類が若干異なるらしい…

一応、留意点です。

Page 77: Big Data入門に見せかけたFluentd入門

インストール前に必要な、  ちょっとした準備があります。  

hOp://docs.fluentd.org/ja/arTcles/before-­‐install

NTPの設定、ファイルディスクリプタの最大値増加、ネットワーク関係のカーネルパラメータの最適化。設定後、OSの再起動が必要です。

Page 78: Big Data入門に見せかけたFluentd入門

セットアップ

セットアップが容易という特徴です。

Page 79: Big Data入門に見せかけたFluentd入門

コンフィグファイル

セットアップは単一のコンフィグファイルを編集することで行います。

Page 80: Big Data入門に見せかけたFluentd入門

場所

コンフィグファイルは以下の場所にあります。

Page 81: Big Data入門に見せかけたFluentd入門

gemでインストールした場合は、コマンドでパスを指定します。td-agentを利用する場合は、特定のパスにコンフィグファイルがあります。

Page 82: Big Data入門に見せかけたFluentd入門

形式

コンフィグファイルの形式を見てみましょう。

Page 83: Big Data入門に見せかけたFluentd入門

Apacheのコンフィグに近い、構造化テキストです。

風味

Page 84: Big Data入門に見せかけたFluentd入門

構成

XMLの構成を見てみましょう。

Page 85: Big Data入門に見せかけたFluentd入門

Fluentdのコンフィグファイルは、3つのディレクティブから成り立っています。シンプルですね。

Page 86: Big Data入門に見せかけたFluentd入門

構造化ログ

ログが構造化されているという特徴についてです。

Page 87: Big Data入門に見せかけたFluentd入門

{  “Time”:”2013-­‐07-­‐05  09:00:00”,  ”Tag”:”apache.log”,  ”Record”:{“host”:”127.0.0.1”,”method”:”GET”,”path”:”/”}  }

Fluentdが出力するイベントログは、先述の通り、JSONで構造化されています。例えばApacheのログを読み込み、このように出力することができます。

Page 88: Big Data入門に見せかけたFluentd入門

入力ソース

入力ソースを自由に選べることが特徴の一つです。どれくらい自由なのでしょう?

Page 89: Big Data入門に見せかけたFluentd入門

プラグインで  自由に定義可能  

定義できさえすれば、何でも入力ソースにできます。

Page 90: Big Data入門に見せかけたFluentd入門

出力先

出力先を自由に選べることも特徴の一つです。どれくらい自由なのでしょう?

Page 91: Big Data入門に見せかけたFluentd入門

プラグインで  自由に定義可能  

こちらも、扱える範囲であれば、どこへでも出力できます。

Page 92: Big Data入門に見せかけたFluentd入門

機能拡張

機能拡張が容易であることも特徴の一つです。

Page 93: Big Data入門に見せかけたFluentd入門

Rubyで  自由に拡張可能  

Rubyでプラグインを作ることができます。

Page 94: Big Data入門に見せかけたFluentd入門

速度

FluentdはRubyで書かれていますが、速度が必要な部分はCで書かれています。それによる高速さを示す事例を紹介します。

Page 95: Big Data入門に見せかけたFluentd入門

事例1  Cookpad  

hOp://www.slideshare.net/hotchpotch/20120204fluent-­‐logging

合計100台弱からtd-agentでログを収集し、ほとんどのロギングはfluentdに移行。中央のfluentdは1台で、1スレッドで十分処理できているとのことです。

Page 96: Big Data入門に見せかけたFluentd入門

事例2  NHN  Japan  

hOp://www.slideshare.net/tagomoris/log-­‐analysis-­‐with-­‐hadoop-­‐in-­‐livedoor-­‐2013

16ノードからログの収集を行い、毎秒120,000+行の転送量、最高400Mbpsを記録し、毎日1.5+TBのログを集めいているとのことです。

Page 97: Big Data入門に見せかけたFluentd入門

メンテナンス

Fluentdはもちろんメンテナンスされているソフトウェアです。

Page 98: Big Data入門に見せかけたFluentd入門

オープンソース  コミュニティ

本体は開発者である古橋氏を中心に、33名のコントリビューターがいます。膨大なプラグインはコミュニティの各メンバーが開発・メンテしています。

Page 99: Big Data入門に見せかけたFluentd入門

使用例

簡単な使用例を紹介します。

Page 100: Big Data入門に見せかけたFluentd入門

192.168.0.3

←  あえて混在環境を   作り出すため   gemでインストール

←  商用を想定し   td-­‐agentでインストール

GlusterFSのクラスタで各ノードに出力されるログを集めてみましょう。

Page 101: Big Data入門に見せかけたFluentd入門

<source> type tail path /var/log/glusterfs/usr-local-glusterfs-3.4.0beta2-etc-glusterfs-glusterd.vol.log pos_file /var/log/td-agent/usr-local-glusterfs-3.4.0beta2-etc-glusterfs-glusterd.vol.log.pos tag glusterd format /^(?:\[(?<date_ymd>[0-9]{4}-[01][0-9]-[0-3][0-9]) (?<time_hms>[0-2][0-9]\:[0-5][0-9]\:[0-6][0-9])\.(?<time_usec>[0-9]{6})\]) (?<log_level>[TDINWECA]) (?:\[(?<source_file_name>[^\[\]:/ ]*):(?<source_line>[0-9]*):(?<function_name>[^\[\]:/ ]*)\]) (?<component>[^\[\]:/ ]*)\: *(?<message>.*)$/ rotate_wait 5 </source>

/etc/td-­‐agent/td-­‐agent.conf  (GlusterFS側)

GlusterFS側のtd-agentには、glusterdのログファイルをtailさせます。sourceディレクティブにはこのように記述します。

Page 102: Big Data入門に見せかけたFluentd入門

<match glusterd.**> type hostname key_name host add_prefix filtered </match> <match filtered.glusterd.**> type forward send_timeout 60s recover_wait 10s heartbeat_interval 1s phi_threshold 8 hard_timeout 60s <server> name dev-centos host 192.168.0.3 port 24224 weight 60 </server> <secondary> type file path /var/log/td-agent/forward-failed </secondary> </match>

/etc/td-­‐agent/td-­‐agent.conf  (GlusterFS側)

matchディレクティブでは、hostnameプラグインを使用し、イベントログの中にノード名を挿入するようにしました。

# wget https://raw.github.com/fukata/fluent-plugin-hostname/master/lib/fluent/plugin/out_hostname.rb

/etc/td-­‐agent/plugin  にプラグインをインストール  (GlusterFS側)

Page 103: Big Data入門に見せかけたFluentd入門

<source> type forward port 24224 bind 0.0.0.0 </source> <match filtered.glusterd.**> type file path /home/keith/var/log/fluent/glusterd </match>

$HOME/fluent/fluent.conf  (192.168.0.3側)

ログ収集を行うノードには、出力先のディレクトリパスを指定します。

Page 104: Big Data入門に見せかけたFluentd入門

[root@dev-centos ~]# gluster volume info dist Volume Name: dist Type: Distribute Volume ID: a62edcc6-23c9-46d8-bf6d-f0682ac08c64 Status: Stopped Number of Bricks: 2 Transport-type: tcp Bricks: Brick1: glusterfs-unstable-01:/mnt/lv0/dist Brick2: glusterfs-unstable-02:/mnt/lv0/dist

192.168.0.3側でGlusterFSのvolumeをstart

[root@dev-centos ~]# gluster volume start dist volume start: dist: success

では、ログを出すために、GlusterFSのvolumeをstartしてみましょう。

Page 105: Big Data入門に見せかけたFluentd入門

Fluentdでログの構造化と転送が行われたことを、192.168.0.3側で確認。

[root@dev-centos ~]# grep glusterfs-unstable-01 /home/keith/var/log/fluent/glusterd.20130708.b4e0ed6e32655d35f | tail -3 2013-07-08T00:52:43+09:00 filtered.glusterd {"date_ymd":"2013-07-07","time_hms":"15:52:43","time_usec":"778961","log_level":"I","source_file_name":"socket.c","source_line":"3495","function_name":"socket_init","component":"0-management","message":"using system polling thread","host":"glusterfs-unstable-01.localdomain"} 2013-07-08T00:52:43+09:00 filtered.glusterd {"date_ymd":"2013-07-07","time_hms":"15:52:43","time_usec":"779397","log_level":"W","source_file_name":"socket.c","source_line":"514","function_name":"__socket_rwv","component":"0-management","message":"readv failed (No data available)","host":"glusterfs-unstable-01.localdomain"} 2013-07-08T00:52:43+09:00 filtered.glusterd {"date_ymd":"2013-07-07","time_hms":"15:52:43","time_usec":"779668","log_level":"I","source_file_name":"socket.c","source_line":"2236","function_name":"socket_event_handler","component":"0-transport","message":"disconnecting now","host":"glusterfs-unstable-01.localdomain"}

formatで指定した正規表現の通りにログをパースし、JSONで転送できていることが確認できました。

[root@dev-centos ~]# grep glusterfs-unstable-02 /home/keith/var/log/fluent/glusterd.20130708.b4e0ed6e32655d35f | tail -3 2013-07-08T00:52:43+09:00 filtered.glusterd {"date_ymd":"2013-07-07","time_hms":"15:52:43","time_usec":"759502","log_level":"I","source_file_name":"socket.c","source_line":"3495","function_name":"socket_init","component":"0-management","message":"using system polling thread","host":"glusterfs-unstable-02.localdomain"} 2013-07-08T00:52:43+09:00 filtered.glusterd {"date_ymd":"2013-07-07","time_hms":"15:52:43","time_usec":"759838","log_level":"W","source_file_name":"socket.c","source_line":"514","function_name":"__socket_rwv","component":"0-management","message":"readv failed (No data available)","host":"glusterfs-unstable-02.localdomain"} 2013-07-08T00:52:43+09:00 filtered.glusterd {"date_ymd":"2013-07-07","time_hms":"15:52:43","time_usec":"760057","log_level":"I","source_file_name":"socket.c","source_line":"2236","function_name":"socket_event_handler","component":"0-transport","message":"disconnecting now","host":"glusterfs-unstable-02.localdomain"}

Page 106: Big Data入門に見せかけたFluentd入門

Fluentdでログの構造化と転送が行われたことを、192.168.0.3側で確認。

[root@dev-centos ~]# grep glusterfs-unstable-01 /home/keith/var/log/fluent/glusterd.20130708.b4e0ed6e32655d35f | tail -3 2013-07-08T00:52:43+09:00 filtered.glusterd {"date_ymd":"2013-07-07","time_hms":"15:52:43","time_usec":"778961","log_level":"I","source_file_name":"socket.c","source_line":"3495","function_name":"socket_init","component":"0-management","message":"using system polling thread","host":"glusterfs-unstable-01.localdomain"} 2013-07-08T00:52:43+09:00 filtered.glusterd {"date_ymd":"2013-07-07","time_hms":"15:52:43","time_usec":"779397","log_level":"W","source_file_name":"socket.c","source_line":"514","function_name":"__socket_rwv","component":"0-management","message":"readv failed (No data available)","host":"glusterfs-unstable-01.localdomain"} 2013-07-08T00:52:43+09:00 filtered.glusterd {"date_ymd":"2013-07-07","time_hms":"15:52:43","time_usec":"779668","log_level":"I","source_file_name":"socket.c","source_line":"2236","function_name":"socket_event_handler","component":"0-transport","message":"disconnecting now","host":"glusterfs-unstable-01.localdomain"}

上がFluentdで構造化したログ、下がオリジナルのログです。

[root@glusterfs-unstable-01 plugin]# tail -3 /var/log/glusterfs/usr-local-glusterfs-3.4.0beta2-etc-glusterfs-glusterd.vol.log [2013-07-07 15:52:43.778961] I [socket.c:3495:socket_init] 0-management: using system polling thread [2013-07-07 15:52:43.779397] W [socket.c:514:__socket_rwv] 0-management: readv failed (No data available) [2013-07-07 15:52:43.779668] I [socket.c:2236:socket_event_handler] 0-transport: disconnecting now

Page 107: Big Data入門に見せかけたFluentd入門

Fluentdの  アーキテクチャ

Fluentdのアーキテクチャについて追ってみましょう。

Page 108: Big Data入門に見せかけたFluentd入門

出典:hOp://www.slideshare.net/treasure-­‐data/the-­‐basics-­‐of-­‐fluentd

Fluentdの本体は3,000-4,000行の小さなソフトウェアで、それはプラガブルな作りとなっており、3つのパートにプラグインを適用して動作させます。

Page 109: Big Data入門に見せかけたFluentd入門

Fluentdのプラグイン  

どのようなプラグインがあるか、見てみましょう。

Page 110: Big Data入門に見せかけたFluentd入門

•  Inputプラグイン

–  in_forward  •  他のfluentd等からイベントログを受け取る

–  in_hOp  •  HTTP  POSTのURLをtag、bodyをrecordとしてイベントログを受け取る。

–  in_tail  •  イベントログをファイルから読み込む

•  ApacheとSyslogのパーサ付き

•  カスタムパーサも書ける

–  in_exec  •  外部プログラムから標準出力経由でTSV形式のイベントログを受け取る

–  in_syslog  •  syslogプロトコルでイベントログを受け取る

–  in_scribe  •  Scribeからイベントログを受け取る

–  ...  Inputプラグインは、外部ソースからイベントログを受け取るインタフェースです。thread socketとlisten socketを生成するためノンブロッキングです。

Page 111: Big Data入門に見せかけたFluentd入門

•  Bufferプラグイン

– buf_memory  •  メモリ上にバッファすることで速度を高める

– buf_file  •  ファイルにバッファすることで信頼性を高める

Bufferプラグインは2種類です。パフォーマンスを向上させるか、信頼性を向上させるかを選ぶことができます。一連の処理をスレッドセーフにする作用もあります。

Page 112: Big Data入門に見せかけたFluentd入門

•  Outputプラグイン

– out_file  •  イベントログをファイルに書き出す

•  ファイルは日ごとに生成する

– out_forward  •  イベントログを他のFluentdに転送する

•  ロードバランシングとフェイルオーバ機能を提供

– out_exec  •  TSV形式のイベントログを標準入力経由で外部プログラムへ渡す

– out_exec_filter  •  out_execにイベントログを渡す前に、他の外部プログラムに対するTSV形式イベン

トログの標準入出力を実行する。

– out_copy  •  イベントログを複製して複数のOutputプラグインに渡す

– out_roundrobin  •  複数のOutputプラグインに対してラウンドロビンでイベントログを渡す

Outputプラグインによって、イベントログの書き出し又は送信を行います。

Page 113: Big Data入門に見せかけたFluentd入門

•  Outputプラグイン(続き)– out_stdout

•  イベントログを標準出力に書き出す

– out_null•  イベントログを捨てる

– out_s3•  Amazon  S3にイベントログを出力する

– out_mongo•  イベントログをMongoDBへ書き出す

– out_mongo_replset•  出力先のMongoDBでReplicaSetを使用する場合はこちらを利用する

– out_webhdfs•  イベントログをHDFSへ書き出す

– …

Outputプラグインによって、イベントログの書き出し又は送信を行います。

Page 114: Big Data入門に見せかけたFluentd入門

多彩な  コミュニティ製  

プラグイン  

コミュニティでは、様々な開発者がプラグインを開発・公開しています。膨大な中から、ピックアップしてみました。

Page 115: Big Data入門に見せかけたFluentd入門

•  flowcounter  –  一定期間中に流れるイベントログの数とデータ量をカウントする

•  dstat  –  dstat用Inputプラグイン

•  ping-­‐message  –  fluentdプロセスをpingで死活監視する

•  munin  –  munin-­‐nodeのメトリックデータを取得するInputプラグイン

•  map  –  あるイベントログを異なるイベントログに変換する

•  noTfier  –  イベントログのマッチングとアラートメッセージの送信を行う

•  sampling-­‐filter  –  イベントログからサンプリングを行う

•  mysql  –  JSONのままMySQLにINSERTを行う

Page 116: Big Data入門に見せかけたFluentd入門

•  amplifier-­‐filter–  イベントログ中の数値の加減を行う

•  flaOen–  ネストされたkey/valueをフラットにする  

•  tail-­‐asis  –  パーサを使わずに行全体をイベントログに格納する

•  cassandra  –  Cassandra用Outputプラグイン

•  mysqlslowquery  –  MySQLのスロークエリログ用Inputプラグイン

•  twiOer  –  TwiOer  Streaming  API用Input/Outputプラグイン

•  zabbix  –  Zabbix用Outputプラグイン

•  mail  –  イベントログをメールに出力する

Page 117: Big Data入門に見せかけたFluentd入門

•  amqp  –  AMQP用Input/Outputプラグイン

•  serialport  –  シリアルポート用Inputプラグイン

•  extract_query_params  –  URLのクエリパラメータからkey/valueを取り出す

•  Tme_parser  –  時刻パラメタ用パーサ

•  irc  –  IRC用Outputプラグイン

•  dbi  –  DBとの接続にRubyのDBIモジュールを使うOutputプラグイン

•  tagfile  –  イベントタグを利用してソースのホスト毎に異なるディレクトリへイベントログをファイル

出力するOutputプラグイン

Page 118: Big Data入門に見せかけたFluentd入門

•  hostname  –  ホスト名をイベントログに挿入する

•  df  –  dfコマンド用Inputプラグイン

•  jvmwatcher  –  Java  VMの情報を収集するInputプラグイン

•  websocket  –  websocketサーバとして機能し、JSON文字列又はMessagePackバイナリを、接続された

全てのクライアントにブロードキャストするOutputプラグイン。

•  resolv  –  IPアドレスの名前解決をして上書きをする

Page 119: Big Data入門に見せかけたFluentd入門

Fluentd  プラグインの  

開発  

プラグインの開発も簡単にできるようになっています。詳しく見てみましょう。

Page 120: Big Data入門に見せかけたFluentd入門

•  カスタムプラグインのインストール

–  rubygemsで配布しない場合

•  /etc/fluent/plugin  にスクリプトを配置する

–  rubygemsで配布する場合

•  lib/fluent/plugin  に<TYPE>_<NAME>.rb  の名前でインストールされるようにする

まず、開発したプラグインをFluentdに読み込むための方法です。RailsのようにCoC(設定よりも規約)なスタイルです。

Page 121: Big Data入門に見せかけたFluentd入門

•  Inputプラグインを書く

– Fluent::Input  クラスを継承

– 規定のメソッドを実装

•  configure(conf)  •  start  •  shutdown  

– イベントログを生成する

•  Fluent::Engine.emit(tag,  Tme,  record)  –  tag:  String  –  Tme:  UNIX  Tme  in  integer  –  record:  Hash  

Inputプラグインの開発の仕方です。クラスを継承して規定のメソッドを実装し、受け取ったログからFluentdのデータ構造に合わせたイベントログを生成するだけです。

Page 122: Big Data入門に見せかけたFluentd入門

•  Bufferd  Outputプラグインを書く

– Fluent::BufferedOutput  クラスを継承

– 規定のメソッドを実装•  configure(conf)  •  start  •  shutdown  •  format(tag,  Tme,  record)  •  write(chunk)  

–  data  =  chunk.read  –  print  data  

– オプション

Outputプラグインは3種類が開発可能です。大筋はInputプラグインと同様です。

Page 123: Big Data入門に見せかけたFluentd入門

•  Time  Sliced  Outputプラグインを書く

– Fluent::TimeSlicedOutput  クラスを継承

– 規定のメソッドを実装

•  configure(conf)  •  start  •  shutdown  •  format(tag,  Tme,  record)  •  write(chunk)  

–  day  =  chunk.key  –  data  =  chunk.read  –  print  data  

例えば1日ごとに出力先ファイルを変更するようなOutputプラグインを書く場合、開発するのはTime Sliced Outputプラグインになります。

Page 124: Big Data入門に見せかけたFluentd入門

•  Non-­‐bufferd  Outputプラグインを書く

– Fluent::Output  クラスを継承

– 規定のメソッドを実装

•  configure(conf)  •  start  •  shutdown  •  emit(tag,  es,  chain)  

–  Fluentdがイベントを受け取ったらコールされる。

– 各イベントを処理するために、es.each  イテレータを使用する。

BufferプラグインをスルーするようなOutputプラグインも作れます。

Page 125: Big Data入門に見せかけたFluentd入門

•  Tail  Inputプラグインでパーサをカスタマイズする方法

– Fluent::TailInput  クラスを継承

– メソッドをオーバーライド

•  configure_parser(conf)  •  parse_line(line)  

ファイルをtailして読み込むようなInputプラグインを作る場合は、TailInputクラスを拡張して簡単に書けるようになっています。

Page 126: Big Data入門に見せかけたFluentd入門

•  プラグインのデバッグ方法

– デバッグメッセージの表示

•  fluentd  -­‐vv  で起動

•  match  **ディレクティブにtype  stdoutを指定

– out_copy  でstoreディレクティブの一つにtype  stdoutを指定

Rubyのpデバッグのような方法でデバッグする方法があります。また、out_copyを使用することで、デバッグ用のOutputプラグインにデータを流し込むことも可能です。

Page 127: Big Data入門に見せかけたFluentd入門

•  テストケースを書く

– Unitテスト・フレームワーク

•  Fluent::Test::InputTestDriver  •  Fluent::Test::OutputTestDriver  •  Fluent::Test::BufferedOutputTestDriver  

Unitテスト用のクラスも用意されています。

Page 128: Big Data入門に見せかけたFluentd入門

作ってみた  

Page 129: Big Data入門に見せかけたFluentd入門

TailInputを利用してGlusterFSの各ノードからログを収集するInputプラグインを書いてみました。ログコレクタ・フレームワークと言って良いくらい楽に作れます。

Class呼び出し時にセットしたいパラメタは、RubyのiniTalizeメソッド内で定義することも、独自のconfig_paramメソッドを使うこともできます。

Page 130: Big Data入門に見せかけたFluentd入門

parse_lineメソッドの引数にログが1行ずつ代入されているので、このメソッド内でパースしていきます。

TailInputでメインとなる作業は、parse_lineメソッドの拡張です。

Page 131: Big Data入門に見せかけたFluentd入門

最終的に、Fixnum型のunixTmeと、Hash型のレコードを、配列で返します。

簡単ですね。

Page 132: Big Data入門に見せかけたFluentd入門

まとめ  

Page 133: Big Data入門に見せかけたFluentd入門

•  Big  Dataを処理するには、前段階として「処理を前提とした収集」が必要。

•  ログコレクタの中で最も注目を集めているのがFluentd。

•  Fluentdはシンプルでプラガブル。柔軟でカスタマイズしやすい。デベロッパ・フレンドリー。

•  今まで個別に存在していたデータも、Fluentdで集約すればBig  Data分析の対象になり得る。レッツトライ。

Page 134: Big Data入門に見せかけたFluentd入門

参考文献  

Page 135: Big Data入門に見せかけたFluentd入門

1.  Christy  PeOey,  "Gartner  Says  Solving  'Big  Data'  Challenge  Involves  More  Than  Just  Managing  Volumes  of  Data"  hOp://www.gartner.com/newsroom/id/1731916  (2013/06/30)  

2.  2012  Big  Data  Now:  2012  EdiFon,  O'Reilly  Media,  Inc.  3.  Noreen  Burlingame  &  Lars  Nielsen,  2012  A  Simple  IntroducFon  To  DATA  SCIENCE,  New  Street  

CommunicaTons,  LLC  4.  三木大知 2013  『パターンでわかるHadoop  MapReduce  -­‐  ビッグデータの処理入門』翔泳社

368pp  5.  John  Gantz  and  David  Reinsel,  "ExtracTng  Value  from  Chaos"  hOp://www.emc.com/

collateral/analyst-­‐reports/idc-­‐extracTng-­‐value-­‐from-­‐chaos-­‐ar.pdf  (2013/06/30)  6.  Pramod  J.  Sadalage,  MarTn  Fowler,  2012  NoSQL  DisFlled  -­‐  A  Brief  Guide  to  the  Emerging  

World  of  Polyglot  Persistence,  Addison-­‐Wesley  Professional  7.  Guido  Schmutz,  2012  Welcome  NoSQL  for  Data  Services,  Data  VirtualizaFon  &  Big  

Data  hOp://www.servicetechsymposium.com/dl/presentaTons/nosql_for_data_services_data_virtualizaTon_and_big_data.pdf  (2013/06/30)  

8.  Shashan  Tiwari  2012『NoSQLプログラミング実践活用技法』翔泳社 432pp  9.  Publickey  「NoSQLの現状。これまでの成功と失敗」 hOp://www.publickey1.jp/blog/13/

nosql_2.html  (2013/06/30)  10.  Pete  Warden,  2011  Big  Data  Glossary  -­‐  A  Guide  to  the  New  GeneraFon  of  Data  Tools,  O'Reilly  

Media,  Inc.  11.  Tom  White,  2012  Hadoop:  The  DefiniFve  Guide,  3rd  EdiFon  -­‐  Storage  and  Analysis  at  Internet  

Scale,  O'Reilly  Media,  Inc.  12.  舘野祐一 「fluentd  を利用した大規模ウェブサービスのロギング」 hOp://

www.slideshare.net/hotchpotch/20120204fluent-­‐logging  (2013/06/30)  

Page 136: Big Data入門に見せかけたFluentd入門

13.  TAGOMORI  Satoshi,  "Log  analysis  system  with  Hadoop  in  livedoor  2013  Winter"  hOp://www.slideshare.net/tagomoris/log-­‐analysis-­‐with-­‐hadoop-­‐in-­‐livedoor-­‐2013  (2013/06/30)  

14.  "Fluentd  DocumentaFon"  hOp://docs.fluentd.org/  (2013/06/29)  15.  @johtani  「Fluentd  Meetup  Japanに参加しました。」 hOp://johtani.jugem.jp/?eid=60  

(2013/07/07)  16.  Sadayuki  Furuhashi,  "Fluentd  meetup  in  Japan  -­‐  Fluentd,  The  Event  Collector  Service"  hOp://

www.slideshare.net/treasure-­‐data/fluentd-­‐meetup-­‐in-­‐japan-­‐11410514  (2013/06/29)  17.  Sadayuki  Furuhashi,  "Fluentd  meetup  #2  -­‐  fluentd,  Log  everything  in  JSON"  hOp://

www.slideshare.net/treasure-­‐data/fluentd-­‐meetup-­‐2  (2013/06/29)  18.  Sadayuki  Furuhashi,  "Fluentd  meetup  #3  -­‐  CollecFng  app  metrics  in  decentralized  systems  -­‐  

Decision  making  based  on  facts"  hOp://www.slideshare.net/treasure-­‐data/fluentd-­‐meetup-­‐3  (2013/06/29)  

19.  Masahiro  Nakagawa,  "The  basics  of  fluentd"  hOp://www.slideshare.net/treasure-­‐data/the-­‐basics-­‐of-­‐fluentd  (2013/06/29)  

20.  "Fluentd  plugins"  hOp://fluentd.org/plugin/  (2013/06/29)  21.  "Treasure  Data:  Big  Data  as  a  Service"  hOp://www.treasure-­‐data.com/  (2013/06/30)  

Page 137: Big Data入門に見せかけたFluentd入門

Thank  you.