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

  • Login to see the comments

Flume

  1. 1. Flume について (“Flume Reliable Distributed Streaming Log Collection” by Jonathan Hsieh, Henry Robinson, Patrick Hunt ; http ://www.cloudera.com/resource/flume-reliable-distributed-streaming-log-collection-hsieh-robinson-hunt の非公式かつ不完全な日本語訳です。 ) Infoscience 永江 哲朗
  2. 2. シナリオ <ul><li>・シチュエーション : </li></ul><ul><li>  - ログを生成するサービスがデータセンターに数百個ある。 </li></ul><ul><li>  そのサービス群は解析したいログを大量に生成する。 </li></ul><ul><li>  - 大量のデータを処理する Hadoop システムを使っている。 </li></ul><ul><li>・問題 : </li></ul><ul><li>  - すべてのログを Hadoop が解析できる場所に送るにはどうしたらよいでしょうか ? </li></ul>
  3. 3. ユースケース <ul><li>・ Hadoop クラスターにあるログを集めるとき </li></ul><ul><li>・ httpd, mail 等のサービスからログを集めるとき </li></ul><ul><li>・アドネットワーク用のカスタムアプリケーションから痕跡 (impressions) を集めるとき </li></ul><ul><li>・まだあります </li></ul><ul><li>  - 可用性の尺度 </li></ul><ul><li>  - オンライン解析 </li></ul>
  4. 4. サンプルトポロジー
  5. 5. “ Flume” があります <ul><li>・ Flume はログをその生成ノードから取得し、処理ノードに集めるための分散系のシステムです。 </li></ul><ul><li>・オープンソースです。ライセンスは Apache v2.0 です。 </li></ul><ul><li>・ Flume の目標 </li></ul><ul><li>  - 信頼性 (Reliability) </li></ul><ul><li>  - スケーラビリティ (Scalability) </li></ul><ul><li>  - 拡張性 (Extensibility) </li></ul><ul><li>  - 管理性 (Manageability) </li></ul>コロンビア・ゴージ ブロートン用水路(木製) Columbia Gorge, Broughton Log Flume
  6. 6. 主要な概念 <ul><li>・データパス (data path) とコントロールパス (control path) </li></ul><ul><li>・ノード (node) はデータパス上にあります。 </li></ul><ul><li>  - ノードはソース (source) とシンク ( 吸い込み ; sink) があります </li></ul><ul><li>  - 異なる役割をします </li></ul><ul><li>   ・典型的なトポロジーではエージェント (agent) ノードとコレクター (collector) ノードがあります </li></ul><ul><li>   ・プロセッサー (processor) ノードというノードもオプション的に存在します。 </li></ul><ul><li>・マスター (master) はコントロールパス上にあります。 </li></ul><ul><li>  - ノードのコンフィグレーションの中心点です。 </li></ul><ul><li>  - 各ノードのソースとシンクを指定します。 </li></ul><ul><li>  - ノード間のデータのフロー (flow) をコントロールできます。 </li></ul><ul><li>  - 1 つのマスターもしくは ZooKeeper のクォーラムを使った複数のマスターが使えます。 </li></ul>
  7. 7. サンプルトポロジー
  8. 8. マスター
  9. 9. 概要 <ul><li>・ Flume って何 ? </li></ul><ul><li>  - 目標と構造 </li></ul><ul><li>・信頼性 </li></ul><ul><li>  - フォールトトレランスと高可用性 </li></ul><ul><li>・スケーラビリティ </li></ul><ul><li>  - Flume ノードとマスターの水平方向のスケーラビリティ </li></ul><ul><li>・拡張性 </li></ul><ul><li>  - Unix の原則 (Unix principle) 、全てのデータ、全てのソース、全てのシンク </li></ul><ul><li>・管理性 </li></ul><ul><li>  - 動的なコンフィグをサポートする集中的な管理 </li></ul>
  10. 10. The logs will still get there. 信頼性 (Reliability)
  11. 11. 障害 <ul><li>・障害は様々なレベルで発生します。 </li></ul><ul><li>  - ソフトウェアアプリケーションは停止することがあります。 </li></ul><ul><li>  - ハードウェアも停止する可能性があります。 </li></ul><ul><li>  - ネットワーク機器も止まることがあります。 </li></ul><ul><li>  - ネットワークの輻輳やサーバーの過負荷 </li></ul><ul><li>  - メンテナンスでの停止 </li></ul><ul><li>・ログが最終的な目的地に到達することをどうやって確かめればよいでしょうか。 </li></ul>
  12. 12. データの信頼性のレベルを選べます <ul><li>・ベストエフォート </li></ul><ul><li>  - 送信後、確認しません。 </li></ul><ul><li>・障害の場合は保存して後で再送 </li></ul><ul><li>  - ローカルな受信応答、エラーを検知できます。 </li></ul><ul><li>  - 障害を検知した場合はフェイルオーバーできます。 </li></ul><ul><li>・エンドツーエンドな信頼性 </li></ul><ul><li>  - エンドツーエンドな受信応答 </li></ul><ul><li>  - 複数回リトライすることで、複合的な障害にもデータは耐えることができます。 </li></ul>
  13. 13. エージェントの停止に対処する <ul><li>・ ( 当然ながら ) データは失いたくありません。 </li></ul><ul><li>・ログの生成ポイントでログに耐久性をもたせます。 </li></ul><ul><li>  - ログの生成ノードが停止したら、ログは生成されません。 </li></ul><ul><li>  - ログの生成ノードが停止後に復旧したら、データはエンドポイントに到達します。 </li></ul><ul><li>    ・データに耐久性をもたせておけば、サーバ復旧後に使用できます。 </li></ul><ul><li>  - ログを生成するアプリケーションにおいて同期書込 (synchronous writes) を許可します。 </li></ul><ul><li>・エージェントが停止したら再起動するようにウォッチドッグプログラムを使いましょう。 </li></ul>
  14. 14. コレクターの停止に対処する <ul><li>・エージェントのところではデータには耐久性があります。 </li></ul><ul><li>  - データロスの可能性とデータロスの可能性を最小化します。 </li></ul><ul><li>  - Not Necessary to durably keep intermediate state at collector ( コレクターの途中の状態を保持する必要はありません ) </li></ul><ul><li>  - コレクターが停止したらリトライします。 </li></ul><ul><li>・エージェントが別のパスを使えるようにホットフェイルオーバーを使いましょう。 </li></ul><ul><li>  - コレクターが停止したらフェイルオーバーするようにマスターから設定できます。 </li></ul>
  15. 15. マスターの停止 <ul><li>・マスターサーバーを単一障害点 (SPOF) にしないでください。 </li></ul><ul><li>・マスターは以下の二種類の情報を保持します。 </li></ul><ul><li>(1) コンフィグレーション情報 ( ノード / フローの設定 ) </li></ul><ul><li>  - 高可用性をもつ ZooKeeper に保存可能です。 </li></ul><ul><li>  - 障害からのリカバリーは容易です </li></ul><ul><li>(2) 一時的な情報 ( ハートビートや ACK 、メトリックのレポート ) </li></ul><ul><li>  - メモリ上に保存されます。 </li></ul><ul><li>  - 障害時にはデータロスします。 </li></ul><ul><li>  - これらの情報は非同期に複製できます (lazy replication) </li></ul>
  16. 16. ケミ川(フィンランド)に溢れるログ(丸太) Logs jamming the Kemi River スケーラビリティ (Scalibility)
  17. 17. サンプルトポロジー
  18. 18. データパスは水平方向にスケーラブルです <ul><li>・可用性を増やすのとより多くのデータを扱うのにコレクターを追加します </li></ul><ul><li>  - 1 つのエージェントはコレクターを占有しないと想定します </li></ul><ul><li>  - ( エージェントと HDFS が直接やり取りするよりも )HDFS への接続は少なくなります。 </li></ul><ul><li>  - ( エージェントと HDFS が直接やり取りするよりも )HDFS に対するより効率的な書込み </li></ul><ul><li>・エージェントはサーバー性能トレードオフに対処するメカニズムをもちます </li></ul><ul><li>  - コレクターのディスク I/O のボトルネックと壊滅的な障害を回避するためにログをローカルに書き込みます。 </li></ul><ul><li>  - 圧縮とバッチ処理 (N/W の帯域のために CPU を使います ) </li></ul><ul><li>  - Push computation into the event collection pipeline (I/O, メモリ、 CPU リソースのボトルネックのバランスをとります ) </li></ul>
  19. 19. ロードバランシング <ul><li>・エージェントは論理的に分割され異なるコレクターに送られます。 </li></ul><ul><li>・多くのコレクターが存在するとき、フェイルオーバー先をランダムにするよう設定することができます。 </li></ul><ul><li>  - コレクターが停止した場合に負荷を分散できます。 </li></ul><ul><li>  - 新しいコレクターが追加された場合、負荷を分散できます。 </li></ul>
  20. 20. ロードバランシング <ul><li>・エージェントは論理的に分割され異なるコレクターに送られます。 </li></ul><ul><li>・多くのコレクターが存在するとき、フェイルオーバー先をランダムにするよう設定することができます。 </li></ul><ul><li>  - コレクターが停止した場合に負荷を分散できます。 </li></ul><ul><li>  - 新しいコレクターが追加された場合、負荷を分散できます。 </li></ul>
  21. 21. コントロールパスも水平方向にスケーラブルです <ul><li>・マスターはノードの設定を動的に変更できます。 </li></ul><ul><li>  - 状態の一貫性を保つために合意 (consensus) プロトコルを使用。 </li></ul><ul><li>  - 設定のトラフィックにもスケールします。 </li></ul><ul><li>  - 将来的なアダプティブな分割にも対応できます。 </li></ul><ul><li>・ノードは任意のマスターと通信できます。 </li></ul><ul><li>・マスターは ZooKeeper のメンバーにアクセスできます。 </li></ul>
  22. 22. <ul><li>・マスターはノードの設定を動的に変更できます。 </li></ul><ul><li>  - 状態の一貫性を保つために合意 (consensus) プロトコルを使用。 </li></ul><ul><li>  - 設定のトラフィックにもスケールします。 </li></ul><ul><li>  - 将来的なアダプティブな分割にも対応できます。 </li></ul><ul><li>・ノードはどのマスターとも通信できます。 </li></ul><ul><li>・マスターは ZooKeeper のノードにアクセスできます。 </li></ul>コントロールパスも水平方向にスケーラブルです
  23. 23. <ul><li>・マスターはノードの設定を動的に変更できます。 </li></ul><ul><li>  - 状態の一貫性を保つために合意 (consensus) プロトコルを使用。 </li></ul><ul><li>  - 設定のトラフィックにもスケールします。 </li></ul><ul><li>  - 将来的なアダプティブな分割にも対応できます。 </li></ul><ul><li>・ノードはどのマスターとも通信できます。 </li></ul><ul><li>・マスターは ZooKeeper のノードにアクセスできます。 </li></ul>コントロールパスも水平方向にスケーラブルです
  24. 24. 生のログ(丸太)を役にたつものに変えましょう… Turn raw logs into something useful… 拡張性 (Extensibility)
  25. 25. Flume は容易に拡張可能です <ul><li>・シンプルなソースとシンク (sink)API </li></ul><ul><li>  - イベント粒度のストリーミング設計 (Event granularity streaming design) </li></ul><ul><li>  - シンプルな命令が多数あり、複雑な動作を構成できます。 </li></ul><ul><li>・エンドツーエンドの原則 </li></ul><ul><li>  - Put smarts and state at the end points. Keep the middle simple. ( 処理と状態をエンドポイントに入れます。パスの間をシンプルに保ちます ) </li></ul><ul><li>・ Flume には信頼性があります。 </li></ul><ul><li>  - Just add a new source or add a new sink and Flume has primitives to deal with reliability. ( 新しいソースとシンクを追加するだけです。 Flume は信頼性を扱う基本構造をもちます ) </li></ul>
  26. 26. 多様なデータソース <ul><li>・プッシュ型とプル型のソースを扱えます。 </li></ul><ul><li>・たくさんのレガシーなイベント ( ログ ) ソースをサポートします。 </li></ul><ul><li>  - ファイルの tail </li></ul><ul><li>  - exec されたプログラムからの定期的な出力 </li></ul><ul><li>  - syslog, syslog-ng </li></ul><ul><li>  - Experimental: IRC / Twitter / Scribe / AMQP </li></ul>
  27. 27. 多様なデータ出力 <ul><li>・データを様々なシンク (sink) に送信できます。 </li></ul><ul><li>  - ファイル、 HDFS, コンソール、 RPC </li></ul><ul><li>  - Experimental: HBase, Voldemort, S3, など </li></ul><ul><li>・拡張可能な出力フォーマットと出力先をサポートします </li></ul><ul><li>  - 言語中立性とオープンなデータフォーマット (JSON, avro, text) </li></ul><ul><li>  - 圧縮された出力ファイルは開発中です </li></ul><ul><li>・送信中のイベントデータを処理するのにデコレーター (decorators) を使えます </li></ul><ul><li>  - サンプリング、属性抽出、フィルタリング、投影 (projection) 、チェックサム、バッチ処理、送信中の圧縮 など… </li></ul>
  28. 28. Wheeeeeeee! ※ 訳注 : “Splash Mountain is a themed log flume ( ここでの’ log flume’ は用水路の意味 ) attraction at Disneyland, Tokyo Disneyland, and the Magic Kingdom” (wikipedia) ということを使った洒落のようです 管理性 (Manageability)
  29. 29. 一元的なデータフローの管理 <ul><li>・ノードのソース (source) 、シンク (sink) 、データフローを 1 箇所で指定します。 </li></ul><ul><li>  - ノードの役割をシンプルに明示します:コレクター、エージェント </li></ul><ul><li>  - ノードに対してカスタム化されたコンフィグも指定できます </li></ul><ul><li>・コントロールインターフェース: </li></ul><ul><li>  - Flume shell </li></ul><ul><li>  - web 画面 </li></ul><ul><li>  - HUE + Flume Manager App (Enterprise users) </li></ul>
  30. 30. 出力のバケット (Output bucketing) <ul><li>・出力ファイルの自動的なマネジメント </li></ul><ul><li>  - 時刻ベースで HDFS ファイルを管理 </li></ul>
  31. 31. シンプル化されたコンフィグレーション <ul><li>・ flume ノードをより抽象的なレベルで設定するには、論理ノード (logical node) を使います。 </li></ul><ul><li>  - Flume ノードは物理ノード (physical node) です。 </li></ul><ul><li>  - それぞれの Flume ノードプロセスは複数の論理ノードをもてます </li></ul><ul><li>・ ( 論理ノードによって ) 以下のことが可能です : </li></ul><ul><li>  - 設定時に指定する量を減らせます。 </li></ul><ul><li>  - 管理プロセス中心の管理のオーバーヘッドを減らせます。 </li></ul><ul><li>  - より細かい粒度のリソースコントロールとフローの分離 </li></ul>
  32. 32. フローの分離 (Flow Isolation) <ul><li>・生成された時刻と場所で、異なる種類のデータを分離できます </li></ul><ul><li>  - 複数の論理ノードをサーバーにもつ </li></ul><ul><li>  - それぞれの論理ノードが独自のデータソースをもつ </li></ul><ul><li>  - それぞれの論理ノードが独自のデータシンク (sink) をもつ </li></ul>
  33. 33. フローの分離 (Flow Isolation) <ul><li>・生成された時刻と場所で、異なる種類のデータを分離できます </li></ul><ul><li>  - 複数の論理ノードをサーバーにもつ </li></ul><ul><li>  - それぞれの論理ノードが独自のデータソースをもつ </li></ul><ul><li>  - それぞれの論理ノードが独自のデータシンク (sink) をもつ </li></ul>
  34. 34. 習熟したユーザー向け ( の話 ) <ul><li>・任意のデータパスを設定するのに簡潔かつ正確なコンフィグレーション言語があります。 </li></ul><ul><li>  - データフローは基本的に DAG( 無閉路有向グラフ、 Directed Acyclic Graph )です。 </li></ul><ul><li>  - 特定の ( ログ ) イベントのフローを制御 </li></ul><ul><li>   ・耐久性とフェイルオーバーのためのメカニズム </li></ul><ul><li>   ・上記メカニズムのパラメータをチューニング </li></ul><ul><li>  - 設定の動的更新 </li></ul><ul><li>   ・フェイルオーバー方法の動的更新 </li></ul><ul><li>   ・新規に追加されたサーバーの管理 </li></ul><ul><li>   ・分析方法の変更 </li></ul>
  35. 35. 結論 northern new mexico, 1957 logpile
  36. 36. 要約 <ul><li>・ Flume は、ログのような大量の連続的なイベントを収集・配信するための分散性と信頼性、およびスケーラビリティをもつシステムです。 </li></ul><ul><li>  - 変更可能な信頼性レベル </li></ul><ul><li>  - ZooKeeper をバックエンドに使った、信頼性のあるマスター </li></ul><ul><li>  - バッチ処理にも使えるように、 HDFS 上でバケット化したファイルにデータを書き込めます。 </li></ul><ul><li>  - 動的に設定可能なノード </li></ul><ul><li>  - エージェントとコレクターのトポロジーに対する、単純化され自動化された管理 </li></ul><ul><li>・ Apache v2.0 ライセンス </li></ul>
  37. 37. Contribute! <ul><li>• GitHub source repo </li></ul><ul><li>– http://github.com/cloudera/flume </li></ul><ul><li>• Mailing lists </li></ul><ul><li>– User: https://groups.google.com/a/cloudera.org/group/flume-user </li></ul><ul><li>– Dev: https://groups.google.com/a/cloudera.org/group/flume-dev </li></ul><ul><li>• Development trackers </li></ul><ul><li>– JIRA (bugs/ formal feature requests): https://issues.cloudera.org/browse/FLUME </li></ul><ul><li>– Review board (code reviews): </li></ul><ul><li>http://review.hbase.org -> http://review.cloudera.org </li></ul><ul><li>• IRC Channels </li></ul><ul><li>– #flume @ irc.freenode.net </li></ul>

×