14
分散ストリーム処理 フレームワーク Apache S4 ヱヂリウム株式会社 渡邉卓也

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

Apache S4

ヱヂリウム株式会社渡邉卓也

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

Advanced Tech Night No. 4 1

Apache S4

✜特徴❚ 汎用分散ストリーム処理フレームワーク❚ スケーラブル

ノード数に制限無し❚ それなりの耐障害性❚ 高い拡張性

JSON経由で様々な言語とやりとり可能✜記述言語

❚ Java

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

Advanced Tech Night No. 4 2

開発状況✜歴史

❚ 2008年10月:Yahoo! Labsで開発開始❚ 2009年9月:オープンソース化❚ 2011年10月:Apache Incubatorへ

✜現行バージョン❚ 0.3.0

http://incubator.apache.org/s4/

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

Advanced Tech Night No. 4 3

「リアルタイム」?✜素早い応答

❚ ミリ秒台から遅くても数秒を想定❚ ただし、(組み込み系のような)応答時間に絶対的な制約がある用途向きではない

✜開発者の想定している用途❚ 集計・フィルタ処理から

例:クリックスルーレートを算出❚ より高度な、適応的な処理までさまざま

例:ユーザの検索行動をリアルタイムに解析、個々人に最適化された広告を表示

実際にYahoo!でパーソナライズドサーチに利用されている、そうです

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

Advanced Tech Night No. 4 4

アーキテクチャ✜構成要素

❚ PE (Processing Elements)❚ App

ストリームで繋がったPEたち❚ イベント

PEにより生成、消費ストリーム上を流れる

PE1

PE2

App

ストリーム

イベント

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

Advanced Tech Night No. 4 5

イベント✜実体

❚ Javaのオブジェクト✜構成要素

❚ 属性(attribute)と値❚ MapReduceと類似❚ ただし

型付けされている複数存在できるPEはどの属性をキーにするかを選べる(key

attribute)

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

Advanced Tech Night No. 4 6

Processing Elements

✜特殊なPE❚ キー無しPE

入力ストリーム中の全てのイベントを消費最初のPEに使われる事が多い

❚ プロトタイプキー属性毎に一つ作られる

✜通常のPE❚ インスタンス

属性の値毎に作られるプロトタイプをコピーすることで生成される各ノードに分散して配置

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

Advanced Tech Night No. 4 7

public class SentenceReceiverPE extends AbstractPE {

public void processEvent(Sentence sentence) { System.out.printf("Sentence is '%s', location %s\n", 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

簡単なPEの例必ずこのクラスを継承する

型毎に定義

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

Advanced Tech Night No. 4 8

<?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

定義ファイルの例

入力ストリームの名前

全てのキーを受け取る(キー無し)

PEプロトタイプの名前

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

Advanced Tech Night No. 4 9

ジョイン処理用定義ファイルの例

http://docs.s4.io/manual/joining_streams.html

<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> </list> </property> <property name="includeFields"> <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>

select Sentence.*, Speech.locationinto SentenceJoinedfrom Sentence, Speechwhere Sentence.speechId = Speech.id

出力のキーを指定する

インスタンスの生存期間

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

Advanced Tech Night No. 4 10

耐障害性✜高可用性

❚ 各ノードは対等❚ スタンバイしているノードを常時用意❚ 障害発生時に切り替え(ウォームフェイルオーバ)

❚ ZooKeeperを利用✜チェックポインティング

❚ ロシー

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

Advanced Tech Night No. 4 11

Stormとの比較

有り無し全数処理の保証

プログラム定義ファイル接続関係の定義

サーバ・クライアント対称ノードの役割分

タプルイベント(オブジェクト)入出力対象

StormS4

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

Advanced Tech Night No. 4 12

最近の動き✜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();

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

Advanced Tech Night No. 4 13

まとめ✜MapReduceと従来のストリーム処理モデルの融合❚ Stormと比べモデルは複雑❚ 込み入った処理はより簡潔に書けるかも