Stormの注目の新機能TridentAPI
Upcoming SlideShare
Loading in...5
×
 

Stormの注目の新機能TridentAPI

on

  • 5,607 views

 

Statistics

Views

Total Views
5,607
Views on SlideShare
4,829
Embed Views
778

Actions

Likes
26
Downloads
87
Comments
0

5 Embeds 778

http://d.hatena.ne.jp 553
http://acro-engineer.hatenablog.com 219
http://webcache.googleusercontent.com 4
http://cc.bingj.com 1
https://twitter.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Stormの注目の新機能TridentAPI Stormの注目の新機能TridentAPI Presentation Transcript

  • Advanced Tech Night No.05 リアルタイム分散処理フレームワーク Stormの注目の新機能 Trident API 2012/09/20 Acroquest Technology 木村 宗太郎
  • 自己紹介• 名前 : 木村宗太郎• 所属 : Acroquest Technology• Twitter : @kimutansk• 主な仕事: Androidサービス基盤開発、性能監視システム開発• 趣味: 料理全般 (特にお菓子作り) 1 Advanced Tech Night
  • 目次(A)そもそもStormって何? (C)注目の新機能 1. Stormとは? Trident API 2. Stormの6つの特長 8. これまでのStormの使い方 3. 類似プロダクトの比較 9. Trident APIとは?(B)Stormの機能/構成 10. Trident APIで 4. Stormの論理構成 出来るようになったこと 11. Trident API 5. Stormのプロセス構成 サンプル実行デモ 6. StreamGrouping 7. Storm実行イメージ 2 Advanced Tech Night
  • そもそもStormって何?
  • 1. Stormとは?1. 『フォールトトレラントなリアルタイム分散処理フレームワーク』 ※簡単に言うと、 ※「一部で障害が発生しても動き続ける早いフレームワーク」2. Twitterではつぶやきのリアルタイム解析に利用 昨日公開1周年!  元々は、米BackType社が開発  Twitter社がBackType社を買収し、オープンソースとして公開(2011/09/19)3. 用途は『連続的に発生するデータを、継続的に処理し続ける』4. コア部分はClojure、コンポーネントはJavaで実装されている。  制御インタフェースはThriftで記述されているため、 他言語からでも操作することが可能。 ※Thrift : Facebook社が開発したRPCライブラリ 4 Advanced Tech Night
  • 2. Stormの6つの特長1. 幅広いユースケース(Extremely broad set of use cases) • ストリーム処理:メッセージ処理やデータベースのリアルタイム更新 • 継続的な処理:発生し続けるデータを継続的に処理 • 例)Twitterのつぶやき、Web上の新規情報等 • 分散RPC:即座に処理する必要があるクエリを並列処理2. スケーラブル(Scalable) • 膨大な処理に対してもマシンを追加するだけでスケール可能。 • アプリケーションの特性に依るが、マシンを追加した分線形にスケール。 5 Advanced Tech Night
  • 2. Stormの6つの特長3. メッセージの処理保証(Guarantees no data loss) • Stormはメッセージが最後まで処理されるかトレースする • 処理失敗した場合はメッセージを取得したスレッドに失敗通知が返る • メッセージ処理保証機構をOFFにして スピード重視の構成にすることも可能4. 環境構築の容易性(Extremely robust) • Stormクラスタは「クラスタ」と呼ばれるが、環境構築は非常に容易 • Stormは全クラスタ共通の設定で動作する • 共通設定を行ったノードを追加するだけでクラスタを拡張可能 6 Advanced Tech Night
  • 2. Stormの6つの特長5. 耐障害性(Fault-tolerant) • Stormはメッセージの処理中に障害が発生した場合、 必要に応じて処理プロセスの再起動/再配分を行う。 • Stormはメッセージ処理を継続することを保証する。6. プログラミング言語非依存(Programming language agnostic) • StormのTopologyと処理コンポーネントは様々な言語で定義でき、 どんな開発者にとっても利用しやすくなっている。 • (例:Java、Clojure、Scala、Ruby、Python etc) 7 Advanced Tech Night
  • 3. 類似プロダクトとの比較 Storm Dempsy S4処理対象単位 Tuple(専用Entity) オブジェクト オブジェクト (オブジェクト内包)ノードの役割分担 マスタ/スレーブ 対称 対称 (SPOFは無い)接続関係の定義 プログラム 定義ファイル 定義ファイル 条件定義可能コンポーネント 継承 アノテーション 継承実装方法メッセージ単位の 失敗検知有り 失敗検知無し 処理負荷に従い処理保証 破棄 8 Advanced Tech Night
  • Stormの機能/構成
  • 4. Stormの論理構成 BoltSpout Bolt Tuple Tuple Tuple Topology Spout & Bolt からなるネットワーク構造 10 Advanced Tech Night
  • 4. Stormの論理構成 Topologyの構成要素 Tuple Stormで処理されるメッセージを保持するデータのこと。 シリアライズ登録をすることで独自エンティティも利用可能。 Stream Tupleが連続的に流れる経路を意味する。 Spout Streamのソースとなるもので、Tupleを送り出す。 Stormのストリーム処理の起点となる。 Bolt Streamの変換処理を行う。 単一、または、複数のStreamからTupleを受信し、 加工した上で、新たなStreamにメッセージを送信する。 Stream、Spout、Boltからなるネットワーク構造のこと。 Topology Stormで処理を実行する場合は、このTopologyの単位で Stormクラスタに渡す。 11 Advanced Tech Night
  • 5. Stormのプロセス構成 Stormクラスタ Supervisor 1ノード Worker Zookeeper Supervisor Worker Nimbus Zookeeper Supervisor Zookeeper Worker 1マシンにSupervisor1プロ Supervisor セスと複数のWorkerプロセ スが存在 Worker 12 Advanced Tech Night
  • 5. Stormのプロセス構成 Nimbus (≒Hadoop:JobTracker) StormクラスタにおけるMasterノードDaemon •Topologyの起動/終了リクエストの待受け •Workerプロセスへのタスクの割り振り •Supervisor/Workerプロセスのモニタリング/再配分Supervisor (≒Hadoop:TaskTracker) StormクラスタにおけるSlaveノードDaemon •Spout/Boltのアサイン待ち受け •Workerプロセスのモニタリング/起動/停止Zookeeper NimbusとSupervisor間の協調 •各ノードで動作するDaemonの状態を管理 •Workerへのアサイン等は全てZookeeperを介して行われる Worker (≒Hadoop:Task) Spout/Boltを実行するプロセス •Topologyのサブセットの実行 13 Advanced Tech Night
  • 6. Stream Groupings TupleがどのBoltに流れるかを指定 Stream Stream Groupings Boltが、インプットとして どのようなStreamを 読み込むかを Stream Groupings 指定する定義 Spout → Bolt → Boltの流れと Stream 流れるTupleのグルーピング定義が可能 Stream Groupings 14 Advanced Tech Night
  • 6. Stream Groupings 7種類の Stream Groupings を知る Shuffle grouping 各Boltが等しい数のTupleを受けとるように、Tupleをサイクリックに配分する。 Fields grouping Streamは、グループで指定されたフィールドによって分割される。 同じ値を持つTupleは、必ず同じタスクへ送信される。 (コンシステント・ハッシュ法) All grouping Streamは複製され、すべてのBoltタスクへ送信される。 Global grouping Stream全体が、ただ一つのBoltタスクへ送信される。 具体的には、Streamは最も小さいIDのタスクへ送信される。 None grouping どのようにStreamがグループ化されるか気にしない。 現状このグループは Shuffle grouping と同じである。 だが、Stormは、このグループのBoltを(可能な場合)送信元のBolt またはSpoutと同じスレッドで実行させる。 Direct grouping Tuple生成者がコンシューマのどのタスクに、Tupleを受けとらせるか決める。 Local or shuffle 同一Workerに送信先Boltが存在すればそのBoltに送信する。 grouping 存在しない場合はShuffle groupingと同じ。 ※同一Worker内の通信時、シリアライズとネットワーク通信が省略されるため、 処理負荷/時間を抑えることが可能。 15 Advanced Tech Night
  • 7. Stormの実行イメージTopologyの構築は非常に簡単!(分散処理を、これだけで実現)// 新規のTopologyを生成TopologyBuilder builder = new TopologyBuilder(); Spoutの名前 Spoutインスタンス// Spout を設定builder.setSpout(“Sentence", new SentenceSpout(), 1); Spout、Bolt共に// Bolt を設定 スレッド数を指定 builder.setBolt(“Split", new SplitBolt(), 1) .shuffleGrouping(“Sentence"); “Split”のOutputを”word”で builder.setBolt(“Word", new WordCountBolt(), 3) Groupingして受信 .fieldsGrouping(“Split ",new Fields(“word"));// Topologyの設定を指定 Worker数を“2”で指定Config conf = new Config(); (Topologyにおいて起動する Topologyの名前conf.setNumWorkers(2); Worker数)// TopologyをStormのクラスタへ登録StormSubmitter.submitTopology(“WordCountTopology", conf, builder.createTopology()); 16 Advanced Tech Night
  • 7. Stormの実行イメージワードカウントの実行イメージ Word Count ["the”,2] 1文を BoltTupleとして 単語に ["the”] 送出 分割 Word Count [“cow”,1]Sentence Split Bolt Spout Bolt [“cow”] ・ 単語の "the cow jumped ・ 発現回数を over the moon“ ・ カウント [“moon”] ・・・ Word Count [“moon”,1] Shuffle Fields Bolt grouping grouping (同じ単語は同じBoltへ送信) 17 Advanced Tech Night
  • 注目の新機能Trident API
  • 8. これまでのStormの使い方これまでStormは「1Tuple/1Boltずつ処理する」のが前提ワードカウントも「1Tupleの処理」を各Boltに分散して記述 Word 1文を Count ["the”,2] Tupleとして送出 単語に分割 ["the”] Bolt Word Sentence Split [“cow”] Spout Bolt Count [“cow”,1] Bolt "the cow jumped ・ over the moon“ [“moon”] ・ 単語の発現回数を ・ カウント ・・・ Word Count [“moon”,1] Bolt 「複数のTupleに対してこうしてね」という 処理を記述することはできなかった 19 Advanced Tech Night
  • 9. Trident APIとは?1. Storm0.8.0で追加された、Stormの抽象化API(≒構文糖衣) ① Tridentを用いることにより、 高スループットかつ状態を持つストリーム処理を構築可能 ② コンセプトとしては、HadoopにおけるPigやCascadingと同一2. Boltを意識することなく下記のような処理を作成可能。 ① ネットワーク通信を行わないプロセス内で区切った処理の定義 ② データの再配分(データの中身は変更しない) ③ データの集計 ④ データのグルーピング ⑤ データのマージ/ジョイン3. インクリメンタルな状態管理を提供 ① 1回のバッチ毎に永続化層(DB等)にデータを保存し、 バッチ実行ごとに加算集計することが可能 20 Advanced Tech Night
  • 9. Trident APIとは?• Trident Topologyでパーツとして利用できるAPI例 (自作機能を追加することも可能) 分割 フィルタ (入力データを分割) (データをフィルタリング) グルーピング 集計 (データをグルーピング) (データを集計) カウント 変換 (発現回数をカウント) (データを変換) キャッシュ ジョイン (データを保持) (キーベースでジョイン) • これらのパーツを組み合わせたデータの整形/統計が Stormの機構上で可能になる。 21 Advanced Tech Night
  • 10. Trident APIで出来るようになったこと実現したいことを例に考えてみると・・・例:ある文書に対するワードカウント → ワードカウントは下記の3ステップに分割される。1. 文章を1文ずつ読みこむ2. 文章を単語ごとに分割する3. 各単語ごとに発現回数をカウントする これをStormで実現するとどうなるか? 22 Advanced Tech Night
  • 10. Trident APIで出来るようになったこと• 【Before】これまでのStormを用いた場合(コンポーネント) Word 1. 文章を1文ずつ Count ["the”,2] 読みこむ 2. 文章を単語ご とに分割する ["the”] Bolt Word Sentence Split [“cow”] Spout Bolt Count [“cow”,1] Bolt 3. 各単語ごとに発 "the cow jumped ・ 現回数をカウントす over the moon“ [“moon”] ・ る ・ ・・・ Word Count [“moon”,1] Bolt 1処理をSpout/Boltにマッピング 23 Advanced Tech Night
  • 10. Trident APIで出来るようになったこと• 【After】Trident APIを用いた場合(コンポーネント) 1. 文章を1文ずつ 2. 文章を単語ご 3. 各単語ごとに発現回 読みこむ とに分割する 数をカウントする ["the”] [“the”,1] Sentence [“cow”] Spout Split Count [“cow”,1] [“moon”] [“moon”,1] "the cow jumped over the moon“ ・・・ Spoutは同じく作成 Boltではなく、「関数」をマッピング 24 Advanced Tech Night
  • 10. Trident APIで出来るようになったこと• 【Before】これまでのStormを用いた場合(Topology定義部分)// 新規のTopologyを生成TopologyBuilder builder = new TopologyBuilder();// Spout を設定builder.setSpout(“Sentence", new SentenceSpout(), 1);// Bolt を設定 builder.setBolt(“Split", new SplitBolt(), 1) .shuffleGrouping(“Sentence"); builder.setBolt(“Word", new WordCountBolt(), 3) .fieldsGrouping(“Split ",new Fields(“word"));// Topologyの設定を指定Config conf = new Config();conf.setNumWorkers(2);// TopologyをStormのクラスタへ登録StormSubmitter.submitTopology(“WordCountTopology", conf, builder.createTopology()); 25 Advanced Tech Night
  • 10. Trident APIで出来るようになったこと• 【After】Trident APIを用いた場合(Topology定義部分)TridentTopology topology = new TridentTopology();TridentState wordCounts = topology .newStream("spout1", spout) .parallelismHint(1) .each(new Fields(“sentence”), new Split(), new Fields(“word”)) ★文章を単位に分割★ .groupBy(new Fields(“word”)) ★単語でグルーピング★ .persistentAggregate(new MemoryMapState.Factory(), new Count(), new Fields(“count”)). parallelismHint(3); ★単語ごとにカウントし保存★ TopologyはDSLのように 簡易に記述可能! 26 Advanced Tech Night
  • 10. Trident APIで出来るようになったこと • 【Before】これまでのStormを用いた場合(Spout)■ SentenceSpout Sentencepublic class RandomSentenceSpout extends BaseRichSpout { SpoutOutputCollector _collector; Spout Random _rand; @Override public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { _collector = collector; _rand = new Random(); } @Override public void nextTuple() { Utils.sleep(100); String[] sentences = new String[] { "the cow jumped over the moon“, "an apple a day keeps the doctor away“, "four score and seven years ago", "snow white and the seven dwarfs“, "i am at two with nature"}; String sentence = sentences[_rand.nextInt(sentences.length)]; _collector.emit(new Values(sentence)); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("word")); }} 27 Advanced Tech Night
  • 10. Trident APIで出来るようになったこと• 【After】Trident APIを用いた場合(Spout) Sentence SpoutFixedBatchSpout spout = new FixedBatchSpout(new Fields("sentence"), 3, new Values("the cow jumped over the moon"), new Values( "the man went to the store and bought some candy"), new Values("four score and seven years ago"), new Values( "how many apples can you eat"), new Values( "to be or not to be the person"));spout.setCycle(true); 28 Advanced Tech Night
  • 10. Trident APIで出来るようになったこと • 【Before】これまでのStormを用いた場合(Bolt) Word■ SplitBolt Split ■WordCountBolt Count Bolt Bolt public static class WordCount extends BaseBasicBolt { Map<String, Integer> counts = new HashMap<String, Integer>(); public class SplitBolt extends BaseBasicBolt { @Override @Override public void execute(Tuple tuple, BasicOutputCollector collector) { public void execute(Tuple tuple, BasicOutputCollector collector) { String word = tuple.getString(0); String sentence = tuple.getString(0); Integer count = counts.get(word); for(String word: sentence.split(" ")) { if(count==null) count = 0; collector.emit(new Values(word)); count++; } counts.put(word, count); } collector.emit(new Values(word, count)); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { @Override declarer.declare(new Fields("word")); public void declareOutputFields(OutputFieldsDeclarer declarer) { } declarer.declare(new Fields("word", "count")); } } } 29 Advanced Tech Night
  • 10. Trident APIで出来るようになったこと • 【After】Trident APIを用いた場合(関数) Split Count■ Split ■ Count public class Count implements CombinerAggregator<Long> {public static class Split extends BaseFunction { @Override public Long init(TridentTuple tuple) { @Override return 1L; public void execute(TridentTuple tuple, } TridentCollector collector) { String sentence = tuple.getString(0); @Override for (String word : sentence.split(" ")) { public Long combine(Long val1, Long val2) { collector.emit(new Values(word)); return val1 + val2; } } } @Override} public Long zero() { return 0L; } } Boltより小さい「関数」で処理を記述可能! Boltを考える必要が無くなる! 30 Advanced Tech Night
  • 11. Trident APIサンプル実行デモ• 下記の構成を持つTrident Topologyのデモを行います。集計処理 “moon” “moon” "the cow jumped “moon” over the moon“ “cow” “cow” ・・・ “cow”文章入力 単語分割 グルーピング カウント “moon”, 10 “cow”, 8 結果保存結果取得処理 “cat” “cat”,5 “cat”,5 DRPC “dog” “dog”,10 “dog”,10 "cat dog jumped” 空データ 合計算出 単語分割 結果取得 フィルタリング 31 Advanced Tech Night
  • • Demo
  • まとめ1. Stormは、 『分散し、フォールトトレラントなリアルタイム処理フレームワーク』2. 6つの特長 ①幅広いユースケース ②スケーラブル ③メッセージの処理保証 ④環境構築の容易性 ⑤耐障害性 ⑥プログラミング言語非依存3. Trident APIの特長 -これまでTuple単位だった処理をTopology全体で実施 -結果データの取得が容易になった4. Trident APIのパーツ 分割、フィルタ、グルーピング、集計、カウント、変換etc5. Trident APIを利用することで、統計処理が容易に実装可能 33
  • Thank youTry Storm And Trident! 34 Advanced Tech Night