2009年5月12日火曜日

Interpreting the Data: Parallel Analysis with Sawzall

Interpreting the Data: Parallel Analysis with Sawzall,
Rob Pike, Sean Dorward, Robert Griesemer, Sean Quinlan,
Scientific Programming Journal, vol. 13 (2005), pp. 277-298.

GFS,Map Reduceを用いたプロセスを容易に記述するための,スクリプト言語.この論文では, Map, Reduceという言葉ではなく,Filter, Aggregate という言葉を使っているようだが,なぜなのかは不明.ひとつのsawzallプログラムは一段のmap,reduceに相当するが,複数のsawzall ぷろぐらむをチェインすることで,複数段のmap reduceができる.が,複数段の実行はパイプライン的には実行できないようだ.

下のプログラムは,浮動小数点のレコードを読み込んで,レコード数,総和,自乗の総和を求めている.最初の3行が変数定義で,それぞれの型と,sum型のaggregateをすることを指定している.4行目でレコードを読み込み,最後の3行でaggregatorへの出力を行っている.

count: table sum of int; 
total: table sum of float; 
sum_of_squares: table sum of float; 

x: float = input; 

emit count <- 1; 
emit total <- x; 
emit sum_of_squares <- x * x; 
table XXX of TYPE のXXX が aggregationの種別になる.これらは,言語で定義され,ユーザが新たに定義することはできない.これはaggregationをオプティマイズするため.可能なaggregationは以下の通り.
  • collection: 集合を作る
  • sample(xxx): xxx個をランダムに抜き出す
  • sum: 総和.TYPEが複合型だった場合には,要素ごとに総和をとる
  • maximum(xxx): 上位 xxx個を取り出す
  • quantile(xxx): xxx個に分位する値を返す
  • top(xxx): もっとも頻度高く現れる値上位xxx個を返す
  • unique(xxx): 重複を除いた要素数の概算を返す.xxxは精度を制御する内部テーブルのサイズ.
実装言語はC++.バイトコードへコンパイルして実行されるが,コンパイルと実行が不可分に行われるので,外部からはインタプリタと同様に見える.

0 件のコメント:

コメントを投稿