Upgrade to Pro — share decks privately, control downloads, hide ads and more …

protoactor-goで Pregelを作った話

protoactor-goで Pregelを作った話

protoactor-goを用いて大規模グラフプロセッシングフレームワークのPregelを実装した話

rerorero

July 17, 2019
Tweet

Other Decks in Programming

Transcript

  1. 3 6 1 2 例: 最大値 3 6 6 2

    2 1 値 アクティブノード 値 非アクティブノード 値 値が更新されたノード メッセージ
  2. 6 6 6 2 例: 最大値 3 6 6 2

    2 1 値 アクティブノード 値 非アクティブノード 値 値が更新されたノード メッセージ
  3. 6 6 6 2 例: 最大値 3 6 6 2

    2 1 値 アクティブノード 値 非アクティブノード 値 値が更新されたノード メッセージ 自分より大きい値 を受け取ったらそ の値で更新 値を更新しなかっ たら非アクティブ
  4. 6 6 6 2 例: 最大値 6 6 値 アクティブノード

    値 非アクティブノード 値 値が更新されたノード メッセージ
  5. 6 6 6 6 例: 最大値 6 6 値 アクティブノード

    値 非アクティブノード 値 値が更新されたノード メッセージ
  6. 6 6 6 6 例: 最大値 6 値 アクティブノード 値

    非アクティブノード 値 値が更新されたノード メッセージ
  7. 6 6 6 6 例: 最大値 6 値 アクティブノード 値

    非アクティブノード 値 値が更新されたノード メッセージ
  8. アクターモデル vs channel アクターモデル (protoactor-go) channel (CSP) 宛先を明示的に指定する 宛先を指定しない 送信時ブロッキングしない

    (メッセージボックスがあふれる可能性) ブロッキングする (デッドロックする可能性) アクターツリー(親子関係)を構築できる ツリー構築は提供していない goroutineの同期ポイント リモートプロセスとも通信できる シングルプロセス内で利用 耐障害性 親アクターが子アクターのリカバリーをする 自動復旧はしない ライブラリによって提供 Go言語によって提供
  9. Hello world (アクター側) import "github.com/AsynkronIT/protoactor-go/actor" type Hello struct{ Who string

    } type HelloActor struct{} func (state *HelloActor) Receive(actorContext actor.Context) { switch msg := actorContext.Message().(type) { case Hello: fmt.Printf("Hello %v\n", msg.Who) } }
  10. Hello world (メッセージ送信) import "github.com/AsynkronIT/protoactor-go/actor" func main() { props :=

    actor.PropsFromProducer(func() actor.Actor { return &HelloActor{} }) pid, err := actor.EmptyRootContext.Spawn(props) if err != nil { // エラー処理 } actor.EmptyRootContext.Send(pid, Hello{Who: "Roger"}) }
  11. 耐障害性 - Let it crash - ハンドリングできないエラーが起きたらとにかくクラッシュ - 親のアクターが子のクラッシュを検知してリカバリーを試みる -

    クラッシュさせるには panicを使う - Supervisor Strategy - 子アクターがクラッシュした時にどうリカバリーするかをカスタマイズできる
  12. Supervisor Strategy decider := func(reason interface{}) actor.Directive { // リカバリーの方法にリスタートを選択

    return actor.RestartDirective } // 1000msec間隔で最大10回までリカバリーを試みる supervisor := actor.NewOneForOneStrategy(10, 1000, decider) props := actor. FromProducer(func() actor.Actor { return &HelloActor{} }). WithSupervisor(supervisor) pid, err := actor.EmptyRootContext.Spawn(props) if err != nil { // エラー処理 }
  13. Supervisor Strategy - One-For-One Strategy - クラッシュしたアクターのみリカバリーを試みる - All-For-One Strategy

    - すべての兄弟アクターに対しリカバリーを試みる - Exponential Backoff Strategy - One-For-Oneのリトライ間隔がExponentialに増える
  14. protoactor-go その他の機能 - .NETでも使える - リモートはgRPCで通信していて .NET ↔ Go でもクラスタを構築可能

    - 他にもPython, Kotlin, JavaScriptのリポジトリも存在(動くかは不明・・) - plugin - メッセージをフックする処理を定義し、差し込むことができる - router - メッセージの送信先を複数アクターから 1つ選択する際の選択条件を指定できる - Virtual Actor - アクターモデルをさらに抽象化して Location TransparencyやAutomatic Scaleなどを提供する - MicrosoftのOrelansという論文がベース - Consulクラスタも別途必要になる
  15. 作ったもの Prerogel https://github.com/rerorero/prerogel - 最大値(maximum)と単一視点最短経路(sssp)のサンプルコード - たくさんマシンを借りて動かしてみたい(まだやってない) - k8sでスケールしたい -

    ※Spark on k8s があるらしいので、まともなやつが欲しい人は試してみるとい いかもしれません - protoactor-goのおかげで1ヶ月くらいでそこそこ動くものができた
  16. ご清聴ありがとうございました 参考文献 - A universal modular ACTOR formalism for artificial

    intelligence: https://dl.acm.org/citation.cfm?id=1624804 - Microsoft Orleans: https://dotnet.github.io/orleans/ - Pregel A system for Large-Scale Graph Processing: https://www.cs.cmu.edu/~pavlo/courses/fall2013/static/papers/p135-malewicz.pdf - Apache Giraph: https://giraph.apache.org/ - A Bridging Model for Parallel Computation: http://web.mit.edu/6.976/www/handout/valiant2.pdf