Sawzall は、 Googleが多数の個々のログレコードを処理するために使用する手続き型ドメイン固有プログラミング言語です。Sawzall は 2003 年に初めて記述され[ 1 ]、szl ランタイムは 2010 年 8 月にオープンソース化されました[ 2 ]。しかし、MapReduceテーブルアグリゲーターがリリースされていないため[ 3 ] 、オープンソース化されたランタイムは、そのままでは複数のログファイルの大規模なデータ分析には役立ちません。Google内では、ほとんどの用途でSawzall は Lingo (ログはGo 言語) に置き換えられています[ 4 ]。
Google のサーバーログは、GFS内の複数のディスクに分割されたレコードの大きなコレクション ( Protocol Buffers ) として保存されます。ログに関連する計算を実行するために、エンジニアはC++ または Java でMapReduceプログラムを作成できます。MapReduce プログラムはコンパイルが必要で、必要以上に冗長になる可能性があるため、ログを分析するプログラムの作成には時間がかかる場合があります。スクリプトを簡単に作成できるようにするために、Rob Pikeらは Sawzall 言語を開発しました。Sawzall スクリプトは MapReduce の Map フェーズ内で実行され、テーブルに値を「出力」します。次に、Reduce フェーズ (スクリプト作成者が気にする必要のないフェーズ) で、複数の実行からのテーブルが単一のテーブルセットに集約されます。
現在、言語ランタイム(単一の入力に対してSawzallスクリプトを一度実行する)のみがオープンソース化されており、MapReduce上に構築されたサポートプログラムはリリースされていません。[ 3 ]
興味深い機能には以下のようなものがあります。
collection発行されたすべての値を保存しますsum発行されたすべての値の合計を保存しますmaximum(n)指定された重みに対して、上位 n 個の値のみを保存します。sample(n)発信されたすべての値からn個の値をランダムに抽出しますquantile(n)与えられた数値の累積確率分布を計算します。top(n)これは、放出された値の中で最も頻繁に出現する可能性のあるn個の値を示します。unique(n)発信される固有値の数を推定します。Sawzallの設計は、パワーよりも効率性とエンジンの簡素化を重視している。
この完全なSawzallプログラムは、入力データを読み込み、レコード数、値の合計、および値の二乗の合計という3つの結果を出力します。
count: テーブル内の整数の合計。 合計: 浮動小数点数のテーブル合計。 sum_of_squares: 浮動小数点数のテーブル合計。 x: float = 入力; カウント <- 1 を発行します。 合計を x で出力します。 emit sum_of_squares <- x * x;