分散ストリーム処理フレームワーク Apache S4

5,470 views

Published on

渡邉 卓也

本セッションでは、分散ストリーム処理フレームワークである「Apache S4」の紹介を行い、
「Storm」との比較によりそれぞれの特徴について説明します。

Published in: Technology

分散ストリーム処理フレームワーク Apache S4

  1. 1. 分散ストリーム処理 フレームワーク Apache S4 ヱヂリウム株式会社 渡邉卓也
  2. 2. Apache S4✜特徴 ❚ 汎用分散ストリーム処理フレームワーク ❚ スケーラブル ノード数に制限無し ❚ それなりの耐障害性 ❚ 高い拡張性 JSON経由で様々な言語とやりとり可能✜記述言語 ❚ Java Advanced Tech Night No. 4 1
  3. 3. 開発状況✜歴史 ❚ 2008年10月:Yahoo! Labsで開発開始 ❚ 2009年9月:オープンソース化 ❚ 2011年10月:Apache Incubatorへ✜現行バージョン ❚ 0.3.0 http://incubator.apache.org/s4/ Advanced Tech Night No. 4 2
  4. 4. 「リアルタイム」?✜ 素早い応答 ❚ ミリ秒台から遅くても数秒を想定 ❚ ただし、(組み込み系のような)応答時間に絶対 的な制約がある用途向きではない✜ 開発者の想定している用途 ❚ 集計・フィルタ処理から 例:クリックスルーレートを算出 ❚ より高度な、適応的な処理までさまざま 例:ユーザの検索行動をリアルタイムに解析、個々人に 最適化された広告を表示 実際にYahoo!でパーソナライズドサーチに利用されてい る、そうです Advanced Tech Night No. 4 3
  5. 5. アーキテクチャ✜ 構成要素 ❚ PE (Processing Elements) ❚ App ストリームで繋がったPEたち ❚ イベント PEにより生成、消費 ストリーム上を流れる App PE1 イベント PE2 ストリーム Advanced Tech Night No. 4 4
  6. 6. イベント✜実体 ❚ Javaのオブジェクト✜構成要素 ❚ 属性(attribute)と値 ❚ MapReduceと類似 ❚ ただし 型付けされている 複数存在できる PEはどの属性をキーにするかを選べる(key attribute) Advanced Tech Night No. 4 5
  7. 7. Processing Elements✜ 特殊なPE ❚ キー無しPE 入力ストリーム中の全てのイベントを消費 最初のPEに使われる事が多い ❚ プロトタイプ キー属性毎に一つ作られる✜ 通常のPE ❚ インスタンス 属性の値毎に作られる プロトタイプをコピーすることで生成される 各ノードに分散して配置 Advanced Tech Night No. 4 6
  8. 8. 簡単なPEの例 必ずこのクラスを継承する public class SentenceReceiverPE extends AbstractPE { public void processEvent(Sentence sentence) { System.out.printf("Sentence is %s, location %sn", sentence.getText(), sentence.getLocation()); } @Override public void output() { 型毎に定義 // not called in this example } @Override public String getId() { return this.getClass().getName(); } } http://docs.s4.io/manual/getting_events_into_s4.html Advanced Tech Night No. 4 7
  9. 9. 定義ファイルの例 PEプロトタイプの名前 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> <bean id="eventCatcher" class="io.s4.example.speech01.SentenceReceiverPE"> <property name="keys"> <list> <value>RawSentence *</value> </list> </property> </bean> </beans> 全てのキーを受け取る(キー無し) 入力ストリームの名前 http://docs.s4.io/manual/getting_events_into_s4.html Advanced Tech Night No. 4 8
  10. 10. <bean id="rerouteSentencePE" class="io.s4.processor.ReroutePE">ジョイン処理用 <property name="id" value="rerouteSentencePE"/> <property name="dispatcher" ref="dispatcher"/>定義ファイルの例 <property name="keys"> <list> <value>RawSentence *</value> </list> </property> 出力のキーを指定する <property name="outputStreamName" value="Sentence"/> </bean><bean id="sentenceJoinPE" class="io.s4.processor.JoinPE"> <property name="id" value="sentenceJoinPE"/> <property name="keys"> <list> <value>Sentence speechId</value> <value>Speech id</value> select Sentence.*, Speech.location </list> into SentenceJoined </property> from Sentence, Speech <property name="includeFields"> where Sentence.speechId = Speech.id <list> <value>Sentence *</value> <value>Speech location</value> </list> </property> <property name="outputStreamName" value="SentenceJoined"/> <property name="outputClassName" value="io.s4.example.speech01.Sentence"/> <property name="dispatcher" ref="dispatcher"/> <property name="ttl" value="600"/></bean> http://docs.s4.io/manual/joining_streams.htmlインスタンスの生存期間 Advanced Tech Night No. 4 9
  11. 11. 耐障害性✜高可用性 ❚ 各ノードは対等 ❚ スタンバイしているノードを常時用意 ❚ 障害発生時に切り替え(ウォームフェイル オーバ) ❚ ZooKeeperを利用✜チェックポインティング ❚ ロシー Advanced Tech Night No. 4 10
  12. 12. Stormとの比較 S4 Storm イベント入出力対象 タプル (オブジェクト)ノードの役割分 サーバ・クライ 対称 担 アント接続関係の定義 定義ファイル プログラム全数処理の保証 無し 有り Advanced Tech Night No. 4 11
  13. 13. 最近の動き✜Prototype app builder ❚ EDSLで接続関係を定義できるようにpe("Print").type(PrintPE.class).asSingleton().pe("User Count").type(CounterPE.class).fireOn(Event.class). afterInterval(100, TimeUnit.MILLISECONDS). emit(CountEvent.class).withKeyFinder(new CountKeyFinder()).to("Print"). pe("Generate User Event").type(GenerateUserEventPE.class).timer(). withPeriod(1, TimeUnit.MILLISECONDS).asSingleton(). emit(UserEvent.class).withKeyFinder(new UserIDKeyFinder()). to("User Count"). build(); Advanced Tech Night No. 4 12
  14. 14. まとめ✜MapReduceと従来のストリーム処理モ デルの融合 ❚ Stormと比べモデルは複雑 ❚ 込み入った処理はより簡潔に書けるかも Advanced Tech Night No. 4 13

×