SyntaxHighlighter

2012年5月27日日曜日

Google App Engine PipelineAPI (1)

前回に引き続き、PipelineAPIについて。


なぜPipeline処理?

Hadoop Cascading(Apacheプロジェクトではない)でも用いられている。Cascadingは、HadoopMapReduceを隠蔽(抽象化)するライブラリー。CascadingではMapReduceタスクをPipeという単位で記述し、Pipeをつなげて処理を行う。MapReduceの複合ジョブを効率的に行う事が出来る。
基本的なMapReduceではReducerの結果をMapperに渡すなどは出来ない。
GoogleAppEngine PipelineAPIでもMapperとの複合を主な用途として紹介している。


Pipeline処理とは

コンピュータにおける処理要素を直列に連結し、ある要素の出力が次の要素の入力となるように配置して処理することである。コンピュータ等の高速化技術の一つである。パイプラインの各要素は並列またはタイムスライス化して実行される。
(出典:Wikipedia パイプライン処理


GoogleAppEngine PipelineAPIの処理概要

PipelineAPIでは、Jobクラスを実装する事により、Pipeline処理を記述していく。
並列したJobはバリア同期によって統合される。
各Job(Record)は自Taskの状態とOutputSlot(出力)とバリア同期の為の情報を持っている。
処理のおおまかな流れは下図の通り(Google I/O 2011より)













Multiply、AddはJobで、SlotA、SlotB、SlotCは出力スロットとなっている。
Barrierはバリア同期を行っている処理でSlotA,SlotBが埋まる事(Fill)によって、
Addが実行(Run)される事を示している。

Taskの状態遷移
【FAN_OUT】Jobの入力処理(Task)を起動させるTask
【HANDLE_SLOT_FILLED】入出力スロットが埋められたら動くTask
【RUN_JOB】バリア同期によるロックが解放されたら動くTask(Jobを実行する)
【FINALIZE_JOB】出力スロットを埋める。
【DELETE_PIPELINE】PipeLine処理終了

処理の詳細について

(次回以降にまた調べてみたところを紹介する予定)

・バリア同期について
バリア同期が行われているTaskはRUN_JOBとFINALIZE_JOB。
バリア同期の情報はwaitingOnMeKeysとして、自Jobが実行するための
埋め待ちSlotの情報を保持している。


・FutureValue,ImidiateValueについて
FutureValueは処理待ちのJobのOutPutSlotの情報を保持している。
ImidiateValueは言葉の通り即値であり、HANDLE_SLOT_FILLEDのTaskが直後に行われる。

・Slotの配置(Keyの採番)について
同期化されたメソッドによって採番されている。(Slotの競合は起きない)

課題、その他

・非同期パイプライン、人間のジョブを挟むパイプライン処理
・各ステージの分割の仕方、最適化について
・どれだけスケールするか、Quotaについて等
・AppEngineMapperとの複合(ここはあまり興味なくなってきたかも)

引き続きGoogleAppEngine PipelineAPIをいじくってみる。
でも気になるから、Cascadingもさわってみるかな。

続く。

0 件のコメント:

コメントを投稿