Greenplum Scatter/Gather Streamingによる高速パラレルロード・アンロード
従来型MPPアプライアンスにおけるボトルネック
ここまでの話でも紹介をしてきた通り、大規模並列処理(Massively Parallel Processing)というアーキテクチャ自身は1984年からの長い実績があるものでした。しかし、ビッグ・データという言葉に代表されるように分析対象のデータが急激に増大するにつれ、これまで大きな課題とされてこなかったある処理に注目が集まるようになってきました。それが、ここで取り上げるデータのロードやアンロードの処理性能です。
従来型MPPにおいてはデータベース内に格納されたデータに対しての操作は大規模並列分散処理を行うことが可能でしたが、データを格納するロードおよびデータを外部に取り出すアンロードについては並列処理を行うことが難しいとされてきました。具体的には、テキストファイルなどのデータソース上のデータは、全ての処理サーバを管理している管理サーバを経由して処理サーバに取り込まれてゆくため、管理サーバがボトルネックになってしまう点が課題とされてきました。このため、処理サーバの台数を増やしたとしてもロードの性能を一定以上に拡張する事ができないことになります。
Greenplum Scatter/Gather Streamingによるロードのパラレル化
このような課題に対して GreenplumDB では”Scatter/Gather”という 2つのフェーズでデータをロードする方式を導入しました。
はじめのフェーズである”Scatter”には「バラバラにする」という意味があり、このフェーズではGreenplumDBはテキストファイル等のロードする対象データを数百KBサイズの小さなデータブロックに分割します。このように対象データを複数に分割することで従来の方式と違ってデータを複数のセグメントサーバが同時に取り込めるようになります。なお、このフェーズでの大切なポイントは、複数のセグメントサーバが取り込むデータブロックはGreenplumDBの分散ポリシーに従っていないということです。GreenplumDBではセグメントサーバにどのようにデータを分散配置するかをテーブル作成時に分散ポリシーを設定することで定義します。しかし、”Scatter”フェーズではとにかくデータソース側から高速に転送することに注力し、分散ポリシーとは関係なく分割されたデータブロックを各セグメントサーバが取り込んでいきます。
分散ポリシーに従ってデータを配置してゆくのは、次のフェーズである”Gather”です。”Gather”という言葉には「まとめる」という意味があり、文字通り”Scatter”フェーズでバラバラになったデータブロックを分散ポリシーに従って「まとめる」作業を行います。”Scatter”フェーズでデータブロックを受取った各セグメントサーバは、データブロック内の複数のデータレコードを読み出し、データレコード毎に分散ポリシーに従って該当するセグメントサーバへインタコネクト経由で転送します。テーブル作成時にセグメントサーバはマスターサーバから分散ポリシーを通達されているため、ロード時において分散ポリシーをマスターサーバに確認する必要がありません。これにより”Gather”フェーズにおいてもセグメントサーバ同士の同期の必要がなくなりマスターサーバで行う処理がなくせるため、従来型MPPと比べてボトルネックのない”Gather” 処理が行うことができます。Scatter/Gather Streamingによるロードの仕組みを示しているフラッシュ動画もあわせてご覧下さい。
パラレルロードのために外部表を活用
Greenplum Scatter/Gather Streamingのロードを実際に行う為の具体的な手順を説明します。ここでは最も一般的なテキストファイルをファイルサーバからロードする処理を例にします。
手順は大きく4つあり、はじめの2つの手順で”Scatter”フェーズ を定義し、その後”Gather”フェーズの定義、最後に実際のロードという手順を経ます。
まずロード用プロセス Greenplum Loaderをファイルサーバ側で起動します。図の中でgpfdistコマンドを実行していますが、これによりGreenplum Loaderが起動しています。Greenplum Loaderは “Scatter”フェーズにおいて対象データをデータブロックに分割し、各セグメントサーバに転送する処理を担います。しかし、この段階ではGreenplum Loaderはどこのサーバに向かってデータブロックを転送すればよいのかが分かりません。このために次の手順が必要となります。
続いてGreenplumDB上で外部表を作成します。 外部表とは、GreenplumDBに格納されていないテキストファイル等のデータを擬似的に表と見立ててクエリアクセスする仕組みです。 外部表を作成する際、カラム名やデータ型を指定するのに加えて、ファイルサーバのネットワークホスト名やテキストファイルの名前を指定します。”Scatter”フェーズにおいてセグメントサーバが一時的に受取るデータブロックの場所とファイル名を定義したことになります。
3つ目の手順は、ロードするデータを格納する表の作成です。この表ではカラム名やデータ型の指定に加え、分散ポリシーを指定します。分散ポリシーの指定にはDISTRIBUTED句を使用しまして、”Scatter”フェーズで各セグメントサーバが取り込んだデータブロックを”Gather”フェーズにてデータレコード毎にどのセグメントサーバへ格納するべきか、「まとめる」べきかを定義しています。
4つ目の手順が、実際のロードです。
手順2で作成した外部表の内容を手順3で作成した表に対してINSERTしていきます。これによってロード用プロセスは対象データをデータブロックに分割した上でそれらをセグメントサーバに転送し、セグメントサーバは一時的に受取ったデータを分散ポリシーに従って所定のセグメントサーバへ格納していきます。