読者です 読者をやめる 読者になる 読者になる

Yahoo!のリアルタイムMapReduce「S4」メモ(2)

自分用メモ。

前回はこちら

リンク集(2)

  • Google group
  • S4論文
    • リンク先に論文のpdfあり
    • フロー図があるので英語読めない人でも見るのおすすめ
  • API javadoc
    • 前回 API は公開されてないと書いたが、前回の記事の投稿直後に公開された。
    • コンポーネントの説明については github リポジトリの説明の回にでも書くのでここでは簡単にしか書かない。
    • Core
      • 計算処理部分。
    • Comm
      • PN/PE間通信部分。クラスタとしての協調部分とも言える。ZKが入っているのもここ。

フォーラムの質問と回答

Flume, JMS との違い、あるいは連携

Google Groups

Q.(質問者 シスコの上級エンジニア Krishna Sankar)

なんか Flume に似てません?


A.(回答者 S4 チーム Anish Nair)

Flume はログ→HDFSのストリーミングに特化していますが S4 は計算プラットフォームとしての側面を持っています。私達は S4 をデータストリーム上においての処理を記述するための手段と認識しています(もちろん分散も含めて)。Flume を S4 の入力ストリームとして使うこともできますよ。そういう意味では、相補的な存在ともいえますね。


Q.(質問者 Lucene in Action, Solr in Action の著者 Otis Gospodnetić)

Flume だけじゃなく JMS とも似てる気がします。Flume の入出力として動作する Java クラスをカスタム処理として追加できますか? 同じことを JMS でもできます?


A. (回答者 Ted Dunning。彼は S4 開発チームではないが、Mahout In Action の著者であり、Plume の開発者でもある)

多分 JMS のように使うこともできるでしょうが、MapReduce 式の関数的契約*1に基づけば、セマンティクスの観点から他のフレームワークよりも自由を得ることができます。

例えばこの契約によって、一般的な JMS フレームワークでは許容されない連続的な MapReduce のデータフローグラフの書き直しができるようになります。
これにより耐障害性を獲得することができ、軽量なメッセージングが行えるようになります。

S4 がこれらの機能全てを提供しているかどうかははっきりしていません。
しかし S4 と、例えば Plume(FlumeJava のクローン。Flume じゃないです)のような投機的実行及び最適化のフレームワークとを併用することにより多くの恩恵を得ることができるのではないかと思っています。

Flume で同じ恩恵を得られるかどうかは分かりません。

ユースケース

Google Groups

Q.(質問者 HighScalability.comの管理人 Todd Hoff)

イベントを処理する機能はすごく複雑なんじゃないですか?
サンプルはフィードを消費しているように見えますが、分散オブジェクトを処理するイベントに基づくアプリケーションインフラストラクチャーとしても機能しそうです。
どういったアプリケーションインフラストラクチャーを得ることができますか?


A.(回答者 Anish Nair)

PEの実装はステートとビヘイビアの両方を実装しています。
ビヘイビアは好きなだけ複雑にすることができますが、トラフィック量とのトレードオフとなります。
私達はシンプルな集約や、複雑なオンライン適応、検索のパーソナライゼーションなどで試してみました。

あなたの言う「分散オブジェクトを処理するイベント」の意味がよくわかりません。
PEは分散オブジェクトで、イベントを通じてインスタンス化されます。
PEと外部システムと直接連携させたいと言っています?


Q.(Todd Hoff)

例えば、友人の集合を含むあるユーザのデータ構造とそのユーザが何かに対して「いいね!」を押した操作情報があったとしましょう。
この場合ソーシャルグラフにエッジを追加する必要があります。

ユーザはメモリ上に永続的オブジェクトして存在しているでしょう。

操作はキーによってそのユーザにルーティングされるイベントとして存在します。

イベントはエッジを追加するアクションを実行します。

エッジの追加は更新イベントを引き起こし、そのようなイベントに関心を持つ全てのものに送信されます。
そして反応イベントがそのキーの最初のリクエスタに返されます。

これが私が話していたフローの例です。


A.(Anish Nair)

素晴らしいユースケースです。

この場合の S4 の実装例は、ユーザに関する状態とエッジ追加のような操作の保持に UserPE を用意します。
適切な EdgePE(ユーザ同士、あるいはユーザとリソースのペアをキーに持つ) にルーティングされるイベントをディスパッチするとき、UserPE は毎回エッジ追加のリクエストを受け取ります*2
どちらの PE もクラスタ内で分散されたオブジェクトの形をとります。
イベントの適切な PE(オブジェクト) へのルーティングは S4 プラットフォームでハンドリングされます。
UserPE と EdgePE は状態の更新時、定期的なインターバル、あるいはあらゆる入力イベントが発生したときならいつでもイベントをディスパッチすることもできます。
こうした出力の「イベントストリーム」は関心を持つもの全て(他の PE、あるいは外部システム)が購読することができます。
だから、かなり何でもできるんですよ。

まとめと次回予告

  • 既に論文も読みかけてるしソースの方も見てるから少しわかってきてるけど、まだよく分からない
  • 次は論文読むか、フォーラムの質問と回答をもう少し続けるか、ソースの方に移るか
  • 動かしてみるのはもうちょい先
  • どうでもいいんだがこいつリアルタイムどころか MapReduce でもなくないか?  論文には MapReduce にインスパイアされたとは書いてあるけど、wiki見るとリアルタイムとも MapReduce とも書いてないし。もしかして広報担当がとばし記事的なプレスリリース出しただけ? 単に自分の理解力が足りないだけかも。もう少し調べてから判断する。

*1:契約プログラミングのこと?

*2:ここよく意味がわからなかった