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.

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

5,899 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

×