Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Flumeを活用したAmebaにおける大規模ログ収集システム-Hadoop Conference Japan 2013 Winter- 株式会社サイバーエージェント アメーバ事業本部 Ameba Technology Laboratory Ju...
株式会社サイバーエージェント                                             2            自己紹介    いいじま   さと    し・    飯島 賢志・    R&D Engineer・...
株式会社サイバーエージェント                                               3        本日の内容・ Ameba サービスと  Ameba Technology Lab について・ Flume...
株式会社サイバーエージェント                                               4・ Ameba サービスと  Ameba Technology Lab について・ Flume について・ Flume ...
スマートフォンサービス   株式会社サイバーエージェント                               5
株式会社サイバーエージェント                                         6Ameba Technology Laboratory・ 2011/4 秋葉原に開設・ 約20名 ( 2013年1月 )
株式会社サイバーエージェント                                                              7                      技術領域             スマホ   ...
株式会社サイバーエージェント                                               8・ Ameba サービスと  Ameba Technology Lab について・ Flume について・ Flume ...
株式会社サイバーエージェント                                             9               自己紹介    コノリー・ユハニ・    Juhani Connolly・    R&D En...
株式会社サイバーエージェント                                                             10Apache Flume(以下Flume)とは?“Flume is a distribut...
株式会社サイバーエージェント                                           11どこから来た?・元々はClouderaのプロジェクトからスタートする・オープンソースでApache Incubatorに移動。...
株式会社サイバーエージェント                                            12開発に関わってる会社現在のコミッターは以下の会社から・Apple・Cloudera(ここ多い!)・Cyberagent・In...
株式会社サイバーエージェント                                   13Apache Flumeの概要
株式会社サイバーエージェント                           14概要 こんな感じ?
株式会社サイバーエージェント                                     15構造を簡単な図にすると「Source」データの源。・Avro/Scribe・Netcat・Exec(実行プログラムに出力)・など・必要であ...
株式会社サイバーエージェント                                       16構造を簡単な図にすると「Channel」データの一時的な溜まり場。・File・Memory・JDBC(遅いため、Fileを推奨)・同じ...
株式会社サイバーエージェント                                     17構造を簡単な図にすると「Sink」データを送る先・もしくは保存するメディア・File/HDFS・Avro・HBase・IRC、Null、L...
株式会社サイバーエージェント                                                18エージェントに関して・最低限でSource・Channel・Sink三つのコンポーネントがそろえば、一つのエージェン...
株式会社サイバーエージェント                       19つまり
株式会社サイバーエージェント                                                  20ノードの繋ぎ型・複数のノードをつなぐには一般的にAvro SinkとAvro Sourceを使います。 ・そうす...
株式会社サイバーエージェント                                        21統合・複数のエージェントのAvroSinkを一つのエージェントのAvroSourceに送り、複数のサーバーからのデータをまとめて処理...
株式会社サイバーエージェント                                                       22概要まとめ・このまま色んなセットアップを紹介出来ますが、ドキュメントにちゃんと説明されていますし、新し...
株式会社サイバーエージェント                                                 23                             Eventその他の機能:イベントとその使い道      ...
株式会社サイバーエージェント                                           24その他機能:インターセプター          ・ソースとチャンネルの間に入れられる部分で          イベントの編集や...
株式会社サイバーエージェント                                           25その他の機能:冗長化など・シンクのグループが管理可能でシンクプロセッサーでデータをグループのどこに送るかコントロール出来ます。...
株式会社サイバーエージェント                                        26    オープンソースなので、必要な機能がなければ作ればいいです!コントリビューションは勿論歓迎していま         す。   ...
株式会社サイバーエージェント                                 27Flumeの送信保証と注意
株式会社サイバーエージェント                              28データロスがない!※※条件付き
株式会社サイバーエージェント                                     29データロスを防止するには何が必要?フローにあるすべてのチャンネルは状態を保存できる物でなければならない。・FileChannelが基本推奨...
株式会社サイバーエージェント                                         30データロスを防止するには何が必要?各ステップの転送方法は逆戻り可能な物でなければならない。・主な例としてAvroSource・Av...
株式会社サイバーエージェント                                      31注意1:データの順番変更・Flumeでは届いたデータの順番が送られた物と同じ順番で届く事を保証していない。・簡単なフローでは順番は守られ...
株式会社サイバーエージェント                                           32注意2:ロスがないが、二重保存がある・HDFSなどへの効率的な書き込みをする時に一気に複数のイベントを保存します。 ・但し一部...
株式会社サイバーエージェント                                      33二重書き込みも順番変更は問題ではない・セットアップがちゃんとしていれば、重複の割合が非常に低い。 ・但し逆に言うとHDFSなどが定期的に...
株式会社サイバーエージェント                                            34他に便利Gangliaメトリックがサポートされていて、フローの最適化や問題解決に非常に役立ちます。
株式会社サイバーエージェント                                               35・ Ameba サービスと  Ameba Technology Lab について・ Flume について・ Flume...
株式会社サイバーエージェント                                      36    Flume の導入事例・ 大量ログを冗長化構成でリアルタイムに  HDFSへ保存・ Hadoopログをリアルタイムに集約管理・ ...
株式会社サイバーエージェント                                      37    Flume の導入事例・ 大量ログを冗長化構成でリアルタイムに  HDFSへ保存・ Hadoopログをリアルタイムに集約管理・ ...
株式会社サイバーエージェント                                                 38          導入前の状況                             - 冗長化構成でHDFS...
株式会社サイバーエージェント                                                                                 39                       シス...
株式会社サイバーエージェント                                               40        Flumeの設定ファイル                           - 冗長化構成でHDFS...
株式会社サイバーエージェント                                                                                                        41  ...
株式会社サイバーエージェント                                                                                                 42         ...
株式会社サイバーエージェント                                                                              43                            ...
株式会社サイバーエージェント                                                                                 44                         ...
株式会社サイバーエージェント                                                                                                            ...
株式会社サイバーエージェント                                                                                                            ...
株式会社サイバーエージェント                                               47         自作のInterceptor    - 冗長化構成でHDFSに保存 -・ 元からあるTimestam...
株式会社サイバーエージェント                                                                                                        48  ...
株式会社サイバーエージェント                                      49    Flume の導入事例・ 大量ログを冗長化構成でリアルタイムに  HDFSへ保存・ Hadoopログをリアルタイムに集約管理・ ...
株式会社サイバーエージェント                                         50              導入前の状況                       - Hadoopログ集約管理 -・ 何十台も...
株式会社サイバーエージェント                                                                        51                           システム構成 ...
株式会社サイバーエージェント                                                                 52       ローカルへのSink方                       ...
株式会社サイバーエージェント                                                 53            ローカルへのSink方                                - ...
株式会社サイバーエージェント                                                                                        54           ローカルへのS...
株式会社サイバーエージェント                                      55    Flume の導入事例・ 大量ログを冗長化構成でリアルタイムに  HDFSへ保存・ Hadoopログをリアルタイムに集約管理・ ...
株式会社サイバーエージェント                                                56          導入前の状況                            - ログのリアルタイム可視化...
株式会社サイバーエージェント                                                 57     GrowthForecast とは                             - ログのリ...
株式会社サイバーエージェント                                                                             58                         システム...
株式会社サイバーエージェント                                                                                  59                  自作のInt...
株式会社サイバーエージェント                                                       60           自作のInterceptor                          ...
株式会社サイバーエージェント                                          61          できあがったグラフ                      - ログのリアルタイム可視化 -リアルタイムに...
株式会社サイバーエージェント                                                               62                     監視                    ...
株式会社サイバーエージェント                                            63       今まで運用してきて・ 今のところパフォーマンスに問題なし・ Flume再起動時にCheckPointのInde...
株式会社サイバーエージェント                                               64       今後のやりたいこと・ 適用範囲の拡大・ ログをフィルタリングして転送・ 特定のログを検知してアラート・ ...
株式会社サイバーエージェント                                           65           まとめ・ 大量ログを冗長化構成でリアルタイムにHDFSへ保存  ⇒バケッティングもできてロスなくログ転送...
株式会社サイバーエージェント                                                      66                     最後に・ サイバーエージェントでは優秀なエンジニアを  募集し...
株式会社サイバーエージェント                               67ご清聴ありがとうございました!
Upcoming SlideShare
Loading in …5
×

Flumeを活用したAmebaにおける大規模ログ収集システム

19,179 views

Published on

Hadoop Conference Japan 2013 Winterの資料です。Flume再起動時のIndex再構築の表現は若干補足修正しました。

Published in: Technology

Flumeを活用したAmebaにおける大規模ログ収集システム

  1. 1. Flumeを活用したAmebaにおける大規模ログ収集システム-Hadoop Conference Japan 2013 Winter- 株式会社サイバーエージェント アメーバ事業本部 Ameba Technology Laboratory Juhani Connolly (Apache Flume PMC/Committer) 飯島 賢志
  2. 2. 株式会社サイバーエージェント 2 自己紹介 いいじま さと し・ 飯島 賢志・ R&D Engineer・ Ameba Technology Lab・ Hadoopログ解析基盤 HBaseを使ったgraphDB 各サービスでFlume導入中
  3. 3. 株式会社サイバーエージェント 3 本日の内容・ Ameba サービスと Ameba Technology Lab について・ Flume について・ Flume の導入事例
  4. 4. 株式会社サイバーエージェント 4・ Ameba サービスと Ameba Technology Lab について・ Flume について・ Flume の導入事例
  5. 5. スマートフォンサービス 株式会社サイバーエージェント 5
  6. 6. 株式会社サイバーエージェント 6Ameba Technology Laboratory・ 2011/4 秋葉原に開設・ 約20名 ( 2013年1月 )
  7. 7. 株式会社サイバーエージェント 7 技術領域 スマホ ニュース ブログ ゲーム ピグ その他多数profile なう Ameba全般 検索 データマイニング 大規模 分散処理 ピグ メッセージ ブログ グルっぽ (ログ解析基盤) ブログ グルっぽ 推薦 フィルタリング
  8. 8. 株式会社サイバーエージェント 8・ Ameba サービスと Ameba Technology Lab について・ Flume について・ Flume の導入事例
  9. 9. 株式会社サイバーエージェント 9 自己紹介 コノリー・ユハニ・ Juhani Connolly・ R&D Engineer・ Ameba Technology Lab・ Flume開発・対応 機械学習 必要に応じてHadoop周り
  10. 10. 株式会社サイバーエージェント 10Apache Flume(以下Flume)とは?“Flume is a distributed, reliable, and availablesystem for efficiently collecting, aggregating, andmoving large amounts of log data from manydifferent sources to a centralized data store.”つまり、高信頼性かつ冗長化可能な大量のデータの収集・統合・転送を行うシステム。
  11. 11. 株式会社サイバーエージェント 11どこから来た?・元々はClouderaのプロジェクトからスタートする・オープンソースでApache Incubatorに移動。・FlumeNGの開発で完全再構築。・2012年の夏にApacheのTLPになる、1.2がリリース(CDH4に現在入ってるバーション)・最新リリースは1月にリリースされたばかりの1.3.1 ・ちなみサイバーエージェントで導入されてるバーションは1.4のトランクに近い物。
  12. 12. 株式会社サイバーエージェント 12開発に関わってる会社現在のコミッターは以下の会社から・Apple・Cloudera(ここ多い!)・Cyberagent・Intuit・Odiago・TrendMicro・無所属Apacheのプロジェクトなので、コントリビューションの実績があれば誰でもなれます。
  13. 13. 株式会社サイバーエージェント 13Apache Flumeの概要
  14. 14. 株式会社サイバーエージェント 14概要 こんな感じ?
  15. 15. 株式会社サイバーエージェント 15構造を簡単な図にすると「Source」データの源。・Avro/Scribe・Netcat・Exec(実行プログラムに出力)・など・必要であれば、カスタムは簡単に作れる。
  16. 16. 株式会社サイバーエージェント 16構造を簡単な図にすると「Channel」データの一時的な溜まり場。・File・Memory・JDBC(遅いため、Fileを推奨)・同じくカスタム可能。ただしトランザクションの実装とかもいるので複雑。
  17. 17. 株式会社サイバーエージェント 17構造を簡単な図にすると「Sink」データを送る先・もしくは保存するメディア・File/HDFS・Avro・HBase・IRC、Null、Logなど・またカスタムプラグインも可能
  18. 18. 株式会社サイバーエージェント 18エージェントに関して・最低限でSource・Channel・Sink三つのコンポーネントがそろえば、一つのエージェントとなります ・コンポーネントは一つずつとは限りません。複数のフローを同じエージェント内で管理してもいいです。 ・また、複数のエージェントを使う事で複数のサーバーのデータをつなげて複雑なフローを簡単に構築出来ます。
  19. 19. 株式会社サイバーエージェント 19つまり
  20. 20. 株式会社サイバーエージェント 20ノードの繋ぎ型・複数のノードをつなぐには一般的にAvro SinkとAvro Sourceを使います。 ・そうすれば最初のエージェントから流れるデータはAvroプロトコルで二つ目のシンクに現れます ・転送が失敗したらトランザクションがロールバックされ、元のチャンネルのデータ取得がキャンセルされます。 Avro Avro
  21. 21. 株式会社サイバーエージェント 21統合・複数のエージェントのAvroSinkを一つのエージェントのAvroSourceに送り、複数のサーバーからのデータをまとめて処理する事が出来ます。・例えば複数のログをHDFSに上げたい時に一つのサーバーで収集して、HDFSシンクに流す。 HDFS?
  22. 22. 株式会社サイバーエージェント 22概要まとめ・このまま色んなセットアップを紹介出来ますが、ドキュメントにちゃんと説明されていますし、新しいのはケースによっても考えられます。・エージェントをソース・チャンネル・シンクで作りそれらをつなげる事で複雑なフローが実行可能。・コンフィグレーションのやり方やすべてのコンポーネントのドキュメンテーションがしっかり書いてある。 ・http://flume.apache.org/FlumeUserGuide.html ・オープンソースにしてはドキュメンテーションがよい(個人的な偏見?)・すべての主なコンポーネントはプラグインでリプレイス出来ますし、開発は簡単。
  23. 23. 株式会社サイバーエージェント 23 Eventその他の機能:イベントとその使い道 Header map:・データはイベントに分かれている。例えばログの一行 ABC => xyz ・イベントにはヘッダーのマップとボ Foo => barディーがついています。 ・ヘッダーを使ってフローのコントロールが出来ます。Channelの時点でイベントによるマルチプレクシングでフロー Body:を分ける事が可能。 Lorem ipsum ・ヘッダーはバケティングなどでも使 dolor sit amet,えます。 consectetur ・イベント作成の時についていますが、次に出るインターセプターでも編集可能。
  24. 24. 株式会社サイバーエージェント 24その他機能:インターセプター ・ソースとチャンネルの間に入れられる部分で イベントの編集やフィルタリングを可能にする。 ・例えばログからタイムスタンプを読み込ん で、ヘッダーに正しいのを書き出す(事例で出 ます) Data ・フィルターとしても使えるし、一つのイベ ントを複数のイベントに分ける事も。 ・簡単に作れる、プラグインで入れられる。 Data+
  25. 25. 株式会社サイバーエージェント 25その他の機能:冗長化など・シンクのグループが管理可能でシンクプロセッサーでデータをグループのどこに送るかコントロール出来ます。 ・Failover ・LoadBalancing・マルチプレクシング以外にも、同じイベントをレプリケーションして、複数のチャンネルに送れる。 ・同じログで二つの事をやりたい時に使える。例えばHDFSに保存して、簡単なメトリックスを計算する。
  26. 26. 株式会社サイバーエージェント 26 オープンソースなので、必要な機能がなければ作ればいいです!コントリビューションは勿論歓迎していま す。 ※作れないならMLに聞くのもあり
  27. 27. 株式会社サイバーエージェント 27Flumeの送信保証と注意
  28. 28. 株式会社サイバーエージェント 28データロスがない!※※条件付き
  29. 29. 株式会社サイバーエージェント 29データロスを防止するには何が必要?フローにあるすべてのチャンネルは状態を保存できる物でなければならない。・FileChannelが基本推奨される物。・MemoryChannelが落ちたら、入ってるデータがすべて消えます。
  30. 30. 株式会社サイバーエージェント 30データロスを防止するには何が必要?各ステップの転送方法は逆戻り可能な物でなければならない。・主な例としてAvroSource・AvroSinkの組み合わせ。・他の転送方法を使うともし次のステップでの保存が失敗したら、前のステップに知らされてないので、元に戻せない。
  31. 31. 株式会社サイバーエージェント 31注意1:データの順番変更・Flumeでは届いたデータの順番が送られた物と同じ順番で届く事を保証していない。・簡単なフローでは順番は守られますが、ロードバランシングやフェイルオーバーを使って複数のパスでたどり着けるとそうなってしまう。
  32. 32. 株式会社サイバーエージェント 32注意2:ロスがないが、二重保存がある・HDFSなどへの効率的な書き込みをする時に一気に複数のイベントを保存します。 ・但し一部の保存が失敗するとトランザクションがロールバックされ、後で同じイベントのバッチの書き込みが再度行われる。 ・そのため一部のデータが最終書き込み先で重複する事があります。
  33. 33. 株式会社サイバーエージェント 33二重書き込みも順番変更は問題ではない・セットアップがちゃんとしていれば、重複の割合が非常に低い。 ・但し逆に言うとHDFSなどが定期的にリクエストの途中でタイムアウト投げてるなら、重複が増えます。・問題視されていない:なぜかと言うと、簡単なMRタスクで解決可能だから。
  34. 34. 株式会社サイバーエージェント 34他に便利Gangliaメトリックがサポートされていて、フローの最適化や問題解決に非常に役立ちます。
  35. 35. 株式会社サイバーエージェント 35・ Ameba サービスと Ameba Technology Lab について・ Flume について・ Flume の導入事例
  36. 36. 株式会社サイバーエージェント 36 Flume の導入事例・ 大量ログを冗長化構成でリアルタイムに HDFSへ保存・ Hadoopログをリアルタイムに集約管理・ アクセスログのリアルタイム可視化
  37. 37. 株式会社サイバーエージェント 37 Flume の導入事例・ 大量ログを冗長化構成でリアルタイムに HDFSへ保存・ Hadoopログをリアルタイムに集約管理・ アクセスログのリアルタイム可視化
  38. 38. 株式会社サイバーエージェント 38 導入前の状況 - 冗長化構成でHDFSに保存 -・ ログはHourlyやDailyでscpとHDFSへのputで保存・ 大量ログの転送後の解析開始時間を早めたい・ ネットワーク負荷の平準化、今後のリアルタイムな 解析のためログをリアルタイムに転送したい
  39. 39. 株式会社サイバーエージェント 39 システム構成 - 冗長化構成でHDFSに保存 -・ Webサーバからアグリゲータに転送しHDFSへ保存 Webサーバ ログ転送 Interceptor ブログ ログ解析 ログ保存 Interceptor 検索 HDFS Interceptor ・ ・ Flume ・ アグリゲータ Flume コレクタ 冗長化 Flume
  40. 40. 株式会社サイバーエージェント 40 Flumeの設定ファイル - 冗長化構成でHDFSに保存 -・ 設定ファイルは3つ /etc/flume/conf ├ flume.conf ├ flume-env.sh └ log4j.properties
  41. 41. 株式会社サイバーエージェント 41 flume.confの構成 - 冗長化構成でHDFSに保存 - ## Name the components on this agent【agent】 agent.sources = scribe 各コンポーネント名を指定 agent.channels = ch1 agent.sinks = avro ## source【source】 agent.sources.scribe.type = org.apache.flume.source.scribe.ScribeSource agent.sources.scribe.channels = ch1 ログ読み込み方法や agent.sources.scribe.port = 1463 Interceptorを指定 agent.sources.scribe.interceptors = ts agent.sources.scribe.interceptors.ts.type = org.apache.flume.interceptor .XXXInterceptor$InterceptorBuilder【channel】 ## channel agent.channels.ch1.type = file eventを転送するまでの agent.channels.ch1.checkpointDir = /tmp/flume-check 一時的な保存方法を指定 agent.channels.ch1.dataDirs = /tmp/flume-data ## sink【sink】 agent.sinks.avro.type = avro agent.sinks.avro.channel = ch1 転送/保存の方法を指定 agent.sinks.avro.hostname = xxx.xxx.xxx.xxx agent.sinks.avro.port = 41415
  42. 42. 株式会社サイバーエージェント 42 flume.confの例 - 冗長化構成でHDFSに保存 -【コレクタ側のsource】 ● scribeソース:ログを読込みThriftプロトコルで流し込む機能を使用 ※以前Scribe利用時に自社開発。ファイル名の正規表現マッチ、 eventヘッダ追加、再送機能などあり ● Interceptor :元のログに何か処理を加えたいとき ## source - scribe agent.sources.scribe.type = org.apache.flume.source.scribe.ScribeSource agent.sources.scribe.port = 1463 agent.sources.scribe.channels = ch1 agent.sources.scribe.interceptors = ts agent.sources.scribe.interceptors.ts.type = org.apache.flume.interceptor.TimeInterceptor$InterceptorBuilder【参考】シンプルにファイルを読込みたいなら ## source – Spooling Directory agent.sources.spool.type = spooldir agent.sources.spool.spoolDir =/var/log/secure agent.sources.spool.channels = ch1
  43. 43. 株式会社サイバーエージェント 43 flume.confの例 - 冗長化構成でHDFSに保存 -【アグリゲータ側のsource】 ● avroソース:コレクタから送られたものをavroとして読み取る ポートは送信元に合わせる ● bind :自身のIPアドレス ## source - avro agent.sources.avro1.type = avro agent.sources.avro1.port = 41414 agent.sources.avro1.channels = ch1 agent.sources.avro1.bind = xxx.xxx.xxx.xxx avro コレクタ アグリゲータ
  44. 44. 株式会社サイバーエージェント 44 冗長化の設定例 - 冗長化構成でHDFSに保存 -・ 冗長化はコレクタ側のsinkで設定。簡単にスケール可能。 ● 転送先のgroupを定義 【コレクタのflume.conf 抜粋】 ## sink - avro agent.sinks.avro1.type = avro agent.sinks.avro1.channel = ch1 agent.sinks.avro1.hostname = xxx.xxx.xxx.xxx agent.sinks.avro1.port = 41414 agent.sinks.avro2.type = avro agent.sinks.avro2.channel = ch1 agent.sinks.avro2.hostname = xxx.xxx.xxx.xxx agent.sinks.avro2.port = 41414 agent.sinkgroups = group1 agent.sinkgroups.group1.sinks = avro1 avro2 agent.sinkgroups.group1.processor.type = load_balance agent.sinkgroups.group1.processor.selector = round_robin
  45. 45. 株式会社サイバーエージェント 45 flume-env.shの例 - 冗長化構成でHDFSに保存 -・ コレクタの設定例。アグリゲータには適宜もっと大きなヒープを設定。 ● ヒープサイズ ● 監視するためのJMX設定 ● Gangliaでメトリクスを収集する設定【flume-env.sh】 JAVA_HOME=/usr/local/java JAVA_OPTS="-server -XX:MaxPermSize=24m -XX:PermSize=24m -XX:SurvivorRatio=8 -Xmn96m -Xmx128m -Xms128m " JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345" JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.ssl=false - Dcom.sun.management.jmxremote.authenticate=false" JAVA_OPTS="${JAVA_OPTS} -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx" JAVA_OPTS="${JAVA_OPTS} -Dflume.monitoring.type=GANGLIA -Dflume.monitoring.hosts=[host_name]:8649"
  46. 46. 株式会社サイバーエージェント 46 log4j.propertiesの例 - 冗長化構成でHDFSに保存 -一般的な設定になります【log4j.properties】 flume.root.logger=INFO,LOGFILE flume.log.dir=/var/log/flume/ flume.log.file=flume.log log4j.logger.org.apache.flume.lifecycle = INFO log4j.logger.org.jboss = WARN log4j.logger.org.mortbay = INFO log4j.logger.org.apache.avro.ipc.NettyTransceiver = WARN log4j.logger.org.apache.hadoop = INFO log4j.rootLogger=${flume.root.logger} # Rolling file appender log4j.appender.LOGFILE=org.apache.log4j.rolling.RollingFileAppender log4j.appender.LOGFILE.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy log4j.appender.LOGFILE.rollingPolicy.FileNamePattern=${flume.log.dir}/${flume.log.file}.%d{yyyy-MM-dd}.gz log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.File=${flume.log.dir}/${flume.log.file} log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss,SSS} %-5p [%t] (%C.%M:%L) %x - %m%n # console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d (%t) [%p - %l] %m%n
  47. 47. 株式会社サイバーエージェント 47 自作のInterceptor - 冗長化構成でHDFSに保存 -・ 元からあるTimestampInterceptorでは、 ログ転送時のtimeがeventヘッダに反映される・ それだと日付変更の直前や障害時には正しく反映 されないことがある・ そこで、ログの中身のtimeを読込み、ヘッダに 反映させる自作のInterceptorで運用中
  48. 48. 株式会社サイバーエージェント 48 自作のInterceptorのソース - 冗長化構成でHDFSに保存 -● ログから日付を取ってきてeventヘッダに設定【org.apache.flume.interceptor.TimeInterceptor.java】 public Event intercept(Event event) { Map<String, String> headers = event.getHeaders(); String[] parts = new String(event.getBody()).split(“[t ]”); String[] date = parts[dateField].split(“-”); myCal.setTimeZone(TimeZone.getTimeZone(timeZoneCode)); myCal.set(GregorianCalendar.YEAR, Integer.parseInt(date[0])); myCal.set(GregorianCalendar.MONTH, Integer.parseInt(date[1]) - 1); myCal.set(GregorianCalendar.DAY_OF_MONTH, Integer.parseInt(date[2])); timestamp = myCal.getTimeInMillis(); headers.put(”timestamp”, timestamp.toString()); return event; } ※エラー処理などは割愛
  49. 49. 株式会社サイバーエージェント 49 Flume の導入事例・ 大量ログを冗長化構成でリアルタイムに HDFSへ保存・ Hadoopログをリアルタイムに集約管理・ アクセスログのリアルタイム可視化
  50. 50. 株式会社サイバーエージェント 50 導入前の状況 - Hadoopログ集約管理 -・ 何十台もHadoopスレーブがあるとログをみたいとき に手間がかかる・ ログが1箇所に集まってたら便利・ HDFSでなくローカルだったらコマンドも色々使える grep / tail / etc…
  51. 51. 株式会社サイバーエージェント 51 システム構成 - Hadoopログ集約管理 -・ Hadoopログをリアルタイムに1台のサーバに保存・ TimeInterceptorを通してログ転送 Hadoopスレーブ ログ転送 Interceptor ローカルに保存 ログ閲覧 Interceptor Flume Interceptor アグリゲータ ・ ・ ・ Flume コレクタ Flume
  52. 52. 株式会社サイバーエージェント 52 ローカルへのSink方 - Hadoopログ集約管理 - 法・ 実用的な形にするには工夫が必要・ File Roll Sinkだと、eventのtimestampヘッダで自動バケッティングできない 【保存先】 /var/log/flume/hadoop/yyyy-mm-dd/….log 機能なし
  53. 53. 株式会社サイバーエージェント 53 ローカルへのSink方 - Hadoopログ集約管理 - 法・ HDFS Sinkなら日付の自動バケッティングができる
  54. 54. 株式会社サイバーエージェント 54 ローカルへのSink方 - Hadoopログ集約管理 - 法● HDFS Sinkでローカルに保存するように指定● eventのtimestampヘッダで日付のバケッティング● 日付の他にもヘッダを利用してパラメータ指定できる 【flume.confの抜粋】 ## sink agent.sinks.file.type = hdfs agent.sinks.file.channel = ch1 agent.sinks.file.hdfs.path = file:///var/log/flume/hadoop/%Y-%m-%d agent.sinks.file.hdfs.filePrefix = %{category}.log agent.sinks.file.hdfs.fileType = DataStream agent.sinks.file.hdfs.writeFormat = text ←つい先週追加された機能 agent.sinks.file.hdfs.useRawLocalFileSystem = true ※JIRAのFLUME-1844
  55. 55. 株式会社サイバーエージェント 55 Flume の導入事例・ 大量ログを冗長化構成でリアルタイムに HDFSへ保存・ Hadoopログをリアルタイムに集約管理・ アクセスログのリアルタイム可視化
  56. 56. 株式会社サイバーエージェント 56 導入前の状況 - ログのリアルタイム可視化 -・ 監視ツールではアクセス数やレイテンシはグラフ化 できていない・ アクセスログにはServiceやMethod毎にレイテンシを 書き出している・ そこで、FlumeとGrowthForecastを連携させて アクセス状況をグラフ化したい
  57. 57. 株式会社サイバーエージェント 57 GrowthForecast とは - ログのリアルタイム可視化 -WebAPIに値をリクエストするだけで簡単にグラフ化できるWebツール
  58. 58. 株式会社サイバーエージェント 58 システム構成 - ログのリアルタイム可視化 -・Flumeでアプリケーションログをサマリして必要なデータだけを転送・アグリゲータで集計してGrowthForecastのAPIにリクエスト Webサーバ サマリしたデータ だけ転送 GFにリクエスト Interceptor GF閲覧 Interceptor Interceptor Flume アグリゲータ ・ ・ ログ ・2.5万行/秒 Flume Flume コレクタ
  59. 59. 株式会社サイバーエージェント 59 自作のInterceptor - ログのリアルタイム可視化 -【コレクタ側】・ 大量のログを送ってアグリゲータ側で計算すると負荷が高いので、・ コレクタ側でアクセスログ1行毎からservice・method単位で アクセス数は1ずつ、レイテンシは取得した値でインクリメント※ログの例2013-01-21 14:00:00 … service=AAA … method=BBB … latency=XXX …・ 15秒に1回、service・method単位のアクセス数とレイテンシの 合計をサマリとしてアグリゲータに転送
  60. 60. 株式会社サイバーエージェント 60 自作のInterceptor - ログのリアルタイム可視化 -【アグリゲータ側】・ コレクタの各サーバから転送されたデータを元に 全サーバのservice・method単位の以下を計算 アクセス数:秒間のアクセス数 レイテンシ:1アクセス当たりの平均レイテンシ・ 1分間に1回GrowthForecastのAPIにリクエスト
  61. 61. 株式会社サイバーエージェント 61 できあがったグラフ - ログのリアルタイム可視化 -リアルタイムにグラフ化できた!【アクセス数】【レイテンシ】
  62. 62. 株式会社サイバーエージェント 62 監視 - ログのリアルタイム可視化 - 【Ganglia● Ganglia 】 JMXのメトリクスをグラフ化● アラート監視 ・ ステータスのチェック ・ JMXのメトリクス ・ channelやavroのStopTime ・ ChannelFillPercentage ⇒ログ量に応じてwarnとcriticalで値を分けて管理
  63. 63. 株式会社サイバーエージェント 63 今まで運用してきて・ 今のところパフォーマンスに問題なし・ Flume再起動時にCheckPointのIndex再構築で OutOfMemoryになるときは最大ヒープサイズを調整・ Interceptorなどプラグインを修正・開発すれば やりたいことを実現できる・ 問題が発見されてもオープンソースコミュニティで 素早く修正されている
  64. 64. 株式会社サイバーエージェント 64 今後のやりたいこと・ 適用範囲の拡大・ ログをフィルタリングして転送・ 特定のログを検知してアラート・ 転送したログをDB(MySQL, MongoDB等)に入れる・ MySQLのBinlogからHBaseにインポート
  65. 65. 株式会社サイバーエージェント 65 まとめ・ 大量ログを冗長化構成でリアルタイムにHDFSへ保存 ⇒バケッティングもできてロスなくログ転送できた・ Hadoopログをリアルタイムに集約管理 ⇒1サーバで全台のログを検索/閲覧できるようになった・ アクセスログのリアルタイム可視化 ⇒アクセス数やレイテンシをリアルタイムに把握可能に・ Flumeはプラグインのようなコンポーネント単位の 開発がしやすく柔軟性が高い
  66. 66. 株式会社サイバーエージェント 66 最後に・ サイバーエージェントでは優秀なエンジニアを 募集しています!・ Flumeはコントリビューションを歓迎しています http://flume.apache.org/・ Flumeの質問はこちら user@flume.apache.org もし英語が苦手な方は juhani_connolly@cyberagent.co.jp
  67. 67. 株式会社サイバーエージェント 67ご清聴ありがとうございました!

×