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

Post on 19-Jun-2015

25.388 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

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

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

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

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

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

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

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

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

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

のとします。

Big  Data  is  何?

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

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

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

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

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

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

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

ビジネス面での課題

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

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

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

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

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

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

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

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

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

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

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

技術によるアプローチ

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

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

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

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

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

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

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

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

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

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

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

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

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

何が変わるのか?

分析手法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Big  Data  活用までの道のり

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

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

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

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

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

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

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

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

• データの生成

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

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

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

データ収集

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

従来

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

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

問題点

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

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

ログは  非構造化データ  

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

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

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

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

ログを構造化  するには?

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

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

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

共通化

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

共通の  フォーマット?

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

 ASCIIである  

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

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

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

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

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

それ何て     ?

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

そんなログコレクタ

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

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

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

Scribe

Flume

Fluentd

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

そんなログコレクタ

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

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

Log  everything  in  JSON.

Sponsored  by

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

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

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

インストール

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

  の環境が  ある場合

  の環境が  無い場合

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

td-­‐agent

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

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

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

一応、留意点です。

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

一応、留意点です。

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

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

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

セットアップ

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

コンフィグファイル

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

場所

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

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

形式

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

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

風味

構成

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

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

構造化ログ

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

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

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

入力ソース

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

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

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

出力先

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

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

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

機能拡張

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

Rubyで  自由に拡張可能  

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

速度

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

事例1  Cookpad  

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

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

事例2  NHN  Japan  

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

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

メンテナンス

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

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

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

使用例

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

192.168.0.3

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

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

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

<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ディレクティブにはこのように記述します。

<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側)

<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側)

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

[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してみましょう。

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"}

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

Fluentdの  アーキテクチャ

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

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

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

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を生成するためノンブロッキングです。

•  Bufferプラグイン

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

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

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

•  Outputプラグイン

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

– …

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

多彩な  コミュニティ製  

プラグイン  

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

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

•  dstat  –  dstat用Inputプラグイン

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

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

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

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

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

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

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

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

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

•  cassandra  –  Cassandra用Outputプラグイン

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

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

•  zabbix  –  Zabbix用Outputプラグイン

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

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

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

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

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

•  irc  –  IRC用Outputプラグイン

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

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

出力するOutputプラグイン

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

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

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

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

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

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

Fluentd  プラグインの  

開発  

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

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

–  rubygemsで配布しない場合

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

–  rubygemsで配布する場合

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

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

•  Inputプラグインを書く

– Fluent::Input  クラスを継承

– 規定のメソッドを実装

•  configure(conf)  •  start  •  shutdown  

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

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

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

•  Bufferd  Outputプラグインを書く

– Fluent::BufferedOutput  クラスを継承

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

–  data  =  chunk.read  –  print  data  

– オプション

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

•  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プラグインになります。

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

– Fluent::Output  クラスを継承

– 規定のメソッドを実装

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

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

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

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

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

– Fluent::TailInput  クラスを継承

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

•  configure_parser(conf)  •  parse_line(line)  

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

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

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

•  fluentd  -­‐vv  で起動

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

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

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

•  テストケースを書く

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

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

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

作ってみた  

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

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

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

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

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

簡単ですね。

まとめ  

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

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

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

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

参考文献  

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)  

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)  

Thank  you.  

top related