MapReduce フレームワークのための SQL ライクな言語を使用する

上位レベルの宣言型インターフェースで Hadoop を利用しやすくする

MapReduce の実装のなかから、自分の持っているスキル、好み、そして要件に最も適した実装を選んで大規模データの分析ジョブに対処してください。MapReduce は単純かつ強力なプログラミング・モデルであり、汎用マシンからなる大規模なクラスターで大量のデータを処理するスケーラブルな並列アプリケーションを簡単に開発することができます。MapReduce はアプリケーションを分散プログラムの実行の詳細から切り離しますが、多くのプログラマーは MapReduce プログラミング・スタイルに不慣れであり、SQL ライクな言語を使ってタスクをこなすことを好みます。この記事では、そのようなプログラマーのために MapReduce フレームワークに宣言型インターフェースを追加することを目的に設計された上位レベルの言語およびシステムの概要を説明します。

Sherif Sakr (ssakr@cse.unsw.edu.au), Research Scientist, National ICT Australia

Photo of Sherif SakrDr. Sherif Sakr は、オーストラリア・シドニー所在の NICTA (National ICT Australia) のソフトウェア・システム・グループに所属する研究専門の科学者です。また、ニューサウス・ウェールズ大学 (UNSW) の The School of Computer Science and Engineering (CSE) で共同講師も勤めています。2007年にドイツのコンスタンツ大学でコンピューター・サイエンスの博士号を取得しました。エジプトのカイロ大学のコンピューターおよび情報学部の情報システム学科で、2000年にコンピューター・サイエンスの理学士号を、2003年に修士号を取得しました。2011年には、米国レドモンドにある Microsoft Research の eXtreme Computing Group (XCG) で客員研究科学者として迎えられました。Dr.Sakr は Apache Hadoop の Cloudera 認定開発者です。



2012年 5月 31日

はじめに

ここ 20 年で、コンピューターの計算処理能力が着実に向上したのに伴い、圧倒的な量のデータが行き交うようになったことから、コンピューティング・アーキテクチャーや大規模データ処理メカニズムのパラダイム・シフトがもたらされました。例えば、天文学の強力な望遠鏡、物理学の粒子加速器、生物学のゲノム・シーケンサーは、莫大な量のデータを科学者たちに提供するようになっています。Facebook は毎日 15 テラバイトのデータを収集し、ペタバイト規模のデータウェアハウスに格納しています。大規模なデータ・マイニングおよびデータ分析アプリケーションは業界で必要とされている (Web データ分析、クリック・ストリーム分析、ネットワーク監視のログ分析など) だけではなく、科学の分野でも (大規模なシミュレーション、センサーの設置、高スループットのラボの装置などによって生成されるデータの分析など)、その需要は高まっています。このようなデータ分析アプリケーションのなかには、並列データベース・システムで対処できるものもありますが、並列データベース・システムは高価であり、管理が難しく、長時間実行されるクエリーに必要な耐障害性を欠いています。

MapReduce は、大規模なデータ処理を単一パスで実行する汎用コンピューターのクラスターをプログラミングするために Google が導入したフレームワークです。このフレームワークは、MapReduce クラスターが数千のノードにまで、耐障害性を備えた方法でスケーリングできるように設計されています。その一方、MapReduce プログラミング・モデルに特有の制約もあります。1 つの入力を 2 つのステージで処理する MapReduce のデータ・フローは、非常に下位のレベルでのデータ・フローである上に、極めて厳格で融通が利きません。そのため、例えばごく一般的な処理であってもカスタム・コードを作成しなければなりません。このことから、MapReduce フレームワークは扱いにくいと感じて、上位レベルの宣言型言語として SQL を使用するほうを選ぶプログラマーは大勢います。そこで開発されたのが、プログラマーのタスクを容易にして、MapReduce フレームワークをベースとした上位レベルの宣言型インターフェースを提供するためのプロジェクト (Apache Pig、Apache Hive、および HadoopDB) です。

まずは MapReduce フレームワークについて説明してから、この MapReduce フレームワークに上位レベルのインターフェースを提供するそれぞれのシステムの機能を説明します。


MapReduce フレームワーク

MapReduce フレームワーク手法がもたらす主なメリットは、アプリケーションを分散プログラムの実行の詳細 (データ分配、スケジューリング、耐障害性といった問題など) から切り離せることです。このモデルでは、一連のキーと値のペアを入力として取り、一連のキーと値のペアを出力する計算処理を行います。MapReduce フレームワークのユーザーは、mapreduce という 2 つの関数を使って計算処理を表現します。map 関数は入力のペアを取り、中間結果として複数のキーと値のペアを生成します。MapReduce フレームワークは、同じ中間キー I に関連付けられたすべての中間値を 1 つのグループにして (シャッフル処理)、reduce 関数に渡します。中間キー I とそれに関連付けられた一連の値を受け取った reduce 関数は、これらの値をマージします。通常は、1 回の reduce 呼び出しに対して、出力が生成されないか、1 つの出力値だけが生成されるかのどちらかです。このモデルを使用する主なメリットは、大規模な計算を簡単に並列化することができ、耐障害性のための主要メカニズムとして使用するためにこの並列計算を再実行できることです。

Apache Hadoop プロジェクトは、MapReduce フレームワークの実装を実現することによってデータ集約型の分散アプリケーションをサポートする、オープンソースの Java ソフトウェアです。元々は Yahoo! が Google MapReduce インフラストラクチャーのコピーとして開発したものですが、その後、オープンソースになりました。Hadoop はマシンのクラスター全体にわたってコードの実行を管理します。一般に、データセットが単一の物理マシンのストレージ容量より大きくなると、複数の個別マシンの間で、データセットを分割しなければならなくなります。マシンのネットワーク全体でストレージを管理するファイルシステムは、分散ファイルシステムと呼ばれます。Hadoop には HDFS (Hadoop Distributed File System) と呼ばれる分散ファイルシステムが付随しています。具体的には、HDFS は Hadoop クラスター内のすべてのノードでファイルを保管する分散ファイルシステムです。HDFS はファイルを大きなブロックに分割して、それぞれ異なるマシンに分配するとともに、各ブロックの複数のコピーを作成し、いずれかのマシンに障害が発生してもデータが失われないようにします。

リスト 1 に記載する MapReduce プログラムは、一連のテキスト行に含まれる個々の英単語の出現回数をカウントする擬似コードで記述されています。リスト 1 では、map 関数がそれぞれの英単語とその出現回数のマークを出力し、reduce 関数がそれぞれの英単語に関して出力されたすべてのマークを合計します。

リスト 1. MapReduce プログラム
     map(String key, String value):
     //key: line number, value: line text
     for each word w in value:
          EmitIntermediate(w, ?1?);

     reduce(String key, Iterator values):
          //key: a word, values: a list of counts
     int wordCount = 0;
     for each v in values:
          wordCount += ParseInt(v);
     Emit(AsString(wordCount));

一例として、リスト 2 に示すようなテキスト行の入力シーケンスがあるとします。

リスト 2. 入力シーケンス
1, This is Code Example
2, Example Color is Red
3, Car Color is Green

リスト 3 は、上記の入力に対する map 関数の出力です。

リスト 3. map 関数の出力
('This', 1), ('is', 1). ('Code', 1), ('Example', 1)
('Example', 1), ('Color', 1), ('is', 1), ('Red', 1)
('Car', 1), ('Color', 1), ('is', 1), ('Green', 1)

reduce 関数の出力 (結果) は、リスト 4 のとおりです。

リスト 4. reduce 関数の出力
('Car', 1), ('Code', 1), ('Color', 2), ('Example', 2), ('Green', 1), ('Red', 1)
 , ('This', 1), ('is', 3)

プログラマーにとって MapReduce フレームワークの重要な特徴となっているのは、上位レベルの宣言型プリミティブが 2 つしかなく (map および reduce)、それぞれの並列実行の詳細を心配することなく、これらのプリミティブを任意のプログラミング言語で作成できることです。その反面、以下のように MapReduce プログラミング・モデルに特有の制約もあります。

  1. 1 つの入力を 2 つのステージで処理するデータ・フローは極めて厳格で、柔軟性に欠けています。異なるデータ・フロー (例えば、結合や n ステージなど) を使用するタスクを実行するには、洗練されていない次善策を考え出さなければなりません。
  2. 最も一般的な処理 (プロジェクションやフィルタリングなど) でさえもカスタム・コードが作成されることから、再利用しにくく、保守するのも厄介なコードになりがちです。
  3. map 関数と reduce 関数の不透明さは、システムの最適化機能の妨げとなります。

その上、多くのプログラマーは MapReduce フレームワークに不慣れであるため、上位レベルの宣言型言語として SQL (プログラマーはこの言語に堪能であるため) を使ってタスクを表現するほうを選び、実行の最適化に関する詳細はすべてバックエンド・エンジンに任せるようにします。また、上位レベルでの言語の抽象化によって、基礎となるシステムが自動最適化を実行しやすくなることも事実です。

ここからは、以上の制約に対処して、MapReduce フレームワークに SQL のフレーバーを加えるために設計された言語およびシステムについて見ていきましょう。


Pig

Apache Pig プロジェクトは、Hadoop でデータ・フローを並列実行するエンジンとして設計されています。Pig は、Pig Latin という言語を使用してデータ・フローを表現します。Pig Latin では、1 つ以上の入力からのデータの読み取り、処理、そして 1 つ以上の出力への格納を並行して実行する方法を記述することができます。この言語は、SQL の精神に乗っ取った上位レベルの宣言型問い合わせモデルでのタスクの表現と、MapReduce を使用した下位レベルのプログラミング/手続き型プログラミングでのタスクの表現の中間に位置します。Pig Latin のデータ・フローは、単純な線形フローにすることができますが、複数の入力を結合するポイントと、データを複数のストリームに分割し、それぞれに異なる演算子で処理するポイントを含めた複雑なワークフローにすることもできます。

Pig Latin プログラムは、入力データに適用して出力を生成する一連の処理 (変換) の連鎖で構成されます。これらの処理全体によって表現されるデータ・フローは、Pig 実行環境によって実行可能な表現に変換された後に実行されます。Pig の内部では、一連の変換処理が一連の MapReduce ジョブへと変換されます。

Pig では、豊富なデータ構造体を使用することができます。これらのデータ構造体は一般に複数の値を持ち、ネストされます。したがって、データに適用できる一連の変換処理も大幅に強力になります。具体的に言うと、Pig Latin データ・モデルは以下の 4 つのタイプからなります。

  1. アトム (atom): 文字列や数値などの単純なアトミック値。例えば、”John”。
  2. タプル (tuple): それぞれ任意のデータ型にできる一連のフィールド。例えば、("John", "Melbourne")。
  3. バッグ (bag): 複数のタプルの集まり (タプルが重複しても可)。バッグを構成するタプルのスキーマは、バッグに含まれるすべてのタプルについて、フィールド数とフィールドの型が同じでなくても構わないという点で柔軟です。図 1 に一例として、("John","Melbourne") と "Alice",("UNSW" "Sydney") という 2 つのタプルが含まれるバッグを記載します。
    図 1. バッグ
    2 つのタプルで構成されたバッグの例
  4. マップ (map): データ項目の集まり。各データ項目にはキーが関連付けられ、そのキーによってデータ項目を検索できるようになっています。バッグと同じく、マップを構成するデータ項目のスキーマにも柔軟性がありますが、キーはアトム・データでなければなりません。図 2 に、K1-->("John","Melbourne") と K2-->30 というデータ項目が含まれるマップを記載します。
    図 2. マップ
    2 つのデータ項目で構成されたマップの例

Pig Latin には、従来のデータ操作の多く (joinsortfiltergroup byunion など) を実行するための演算子があります。さらに、データの読み取り、処理、書き込み操作を行う関数をユーザーが独自に開発することもできます。

MapReduce は、グループ化操作 (シャッフル・フェーズと reduce フェーズは基本的にグループ化操作で構成されます) については直接行い、ソート操作についてはグループ化操作を実行することで間接的に行います。フィルタリングとプロジェクションは map フェーズに簡単に実装することができます。しかし、結合をはじめ、それ例外の操作は提供されていないため、ユーザーが作成しなければなりません。Pig には、これらの標準的なデータ操作の複雑で難解な実装が用意されています。例えば、データセット内のキーあたりのレコード数が均等に分布していることはまれなので、多くの場合、リデューサー (Reducer) に送信されるデータには偏りがあります。つまり、あるリデューサーが、他のリデューサーの 10 倍以上のデータを受け取る場合もあるということです。Pig には、このような場合に対処して (場合によっては) リデューサーの間で均等に再配分するための結合演算子とソート演算子があります。表 1 に、Pig Latin 言語の主要な演算子を示します。

MapReduce では、map フェーズおよび reduce フェーズ内のデータ処理はシステムに明らかになりません。つまり、MapReduce にはユーザー・コードを最適化する機会も、チェックする機会もないということです。その一方、Pig は Pig Latin スクリプトを分析して、ユーザーが記述しているデータ・フローを理解することができます。MapReduce では、ユーザーが柔軟に独自のデータ型とシリアライズ・フレームワークを使用できるようにするために、意図的に型システムを用意していません。しかしその一方で、型システムがないために、ユーザー・コードを実行する前およびユーザー・コードの実行中に、コードのエラーをチェックするシステムの機能がさらに制限されることになるという欠点があります。こうしたすべての点から、Pig Latin を使用すると、MapReduce で Java コードを作成して保守する場合よりもコストが大幅に減るということが言えます。

表 1. Pig Latin 言語の主要な演算子
演算子説明
LOADファイルシステムやその他のストレージのデータをリレーションにロードします。
DUMPリレーションをシステム・コンソール FILTER に出力します。
DISTINCTリレーションから重複する行を削除します。
FOREACH ... GENERATEリレーションのフィールドを追加または削除します。
JOIN2 つ以上のリレーションを結合します。
ORDER1 つ以上のフィールドを基準にリレーションをソートします。
LIMITリレーションのサイズをタプルの最大数に制限します。
STOREリレーションをファイルシステムまたはその他のストレージに保存します。
FILTERリレーションから不要な行を削除します。
GROUPデータを単一のリレーションにグループ化します。
CROSS2 つ以上のリレーションのクロス積を生成します。
UNION2 つ以上のリレーションを 1 つのリレーションに組み合わせます。
SPLIT1 つのリレーションを 2 つ以上のリレーションに分割します。

リスト 5 に記載する単純な Pig Latin プログラムは、給与額が高いすべての従業員を検出します。

リスト 5. 給与額が高い全従業員の検出
employees = LOAD 'employee.txt' AS (id, name, salary);
highSalary = FILTER employees BY salary > 100000;
sortedList = ORDER highSalary BY salary DESC;
STORE sortedList INTO ' highSalary _Emp';
DUMP sortedList;

上記の例ではまず、入力ファイルを employees という名前のバッグにロードします。次に highSalary という名前の新しいバッグを作成します。このバッグには、salary フィールドの値が 100000 より大きいレコードのみを格納します。フィルタリングされたレコードは、sortedList バッグによって salary の値を基準に降順にソートされます。そして最後に、sortedList バッグの内容が HDFS に書き込まれ、その内容が画面に出力されます。

リスト 6 に、Pig Latin を使用して join 操作を簡潔に記述する方法を示します。

リスト 6. Pig Latin で join 操作を簡潔に記述する方法
employees = LOAD 'employee.txt' AS (id, name, salary, dept);
departments = LOAD 'dept.txt' AS (deptID, deptName);
joinList = JOIN employees BY dept, departments BY deptID; 
STORE joinList INTO ' joinFile';

従来、SQL などの言語ではアドホック・クエリーを使用することで、データベースに対する迅速な問い合わせを簡単に行ってきました。一部のユーザーは、ロー・データに対する調査に Pig Latin を好んで使用しています。Pig は、スキーマが不明または不完全である場合、あるいはスキーマに一貫性がない場合でも使用できること、そしてネストされたデータを容易に管理できることから、整理されてウェアハウスにロードされる前のデータに対して調査を行いたい場合には、好んで Pig が使われることがよくあります。また、大規模なデータセットに対する調査を行う場合には、Perl や Python などのスクリプト言語を使用して処理を行うことがよくあります。これらの言語を使い慣れているユーザーが SQL の宣言型クエリー・パラダイムよりも Pig のデータ・フロー・パラダイムを選ぶことは、珍しくありません。


Hive

Apache Hive プロジェクトは、Facebook データ・インフラストラクチャー・チームが Hadoop 環境をベースに作成した、オープンソースのデータウェアハウス向けソリューションです。このプロジェクトの主な目標は、よく知られたリレーショナル・データベースの概念 (テーブル、列、パーティションなど) と SQL のサブセットを Hadoop の非構造化の世界に取り込むとともに、Hadoop が持つ拡張性と柔軟性を維持することです。そのために、Hive は主要なすべてのプリミティブ型 (整数型、浮動小数点型、文字列型など) ならびに複合型 (マップ、リスト、構造体など) をサポートしています。また、Hive は SQL ライクな宣言型言語である HiveQL (Hive Query Language) で記述されたクエリーをサポートすることから、SQL を使い慣れていれば簡単に Hive を理解することができます。HiveQL のクエリーは、Hadoop を使用して実行される MapReduce ジョブに自動的にコンパイルされます。さらに、HiveQL では、ユーザーがカスタムの MapReduce スクリプトをクエリーの中に含めることもできます。

HiveQL では DDL (Data Definition Language) 文をサポートしているため、DDL 文を使ってデータベース内のテーブルを作成、破棄、変更することができます。また、DML (Data Manipulation Language) の LOAD 文、INSERT 文を使用して、外部ソースからデータをロードすること、そして Hive のテーブルにクエリーの実行結果を挿入することができます。

ただし今のところ、HiveQL は既存のテーブルの行の更新および削除をサポートしていないので (具体的には、INSERT INTO 文、UPDATE 文、DELETE 文)、複雑なロック・プロトコルを実装することなく、非常に単純なメカニズムを使って、データの読み取り/書き込みの並行処理を行うことができます。Hive のシステム・カタログであるメタストア・コンポーネントにはテーブルに関するメタデータが保管されます。このメタデータは、テーブルの作成中に指定され、そのテーブルが HiveQL で参照されるたびに再利用されます。メタストアでは、Hive と同様のデータ処理システムとして MapReduce のようなアーキテクチャーをベースに作成されたデータ処理システム (例えば Pig Latin) を Hive と比べた場合、Hive を従来のウェアハウス向けソリューションとして認識します。

リスト 7 に、テーブルの作成、データのロード、そしてテーブルの内容に対するクエリーを実行する操作を記述した HiveQL のステートメントの例を記載します。

リスト 7. テーブルを作成し、データをロードして、テーブルの内容に対してクエリーを実行する操作を記述した HiveQL のステートメント
CREATE TABLE employee (empID INT, name STRING, salary BIGINT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
LOAD DATA INPATH "employee_data" INTO TABLE employee;
SELECT * FROM employee WHERE salary > 100000 SORT BY salary DESC;

Hive は、ユーザーが作成した関数によるデータの操作もサポートします (リスト 8 を参照)。

リスト 8. ユーザーが作成した関数によるデータ操作をサポートする Hive
INSERT OVERWRITE TABLE employee
SELECT
TRANSFORM (empID, name, salary, address, department)
USING 'python employee_mapper.py'
AS (empID, name, salary, city)
FROM employee_data;

一般に、リレーショナル・データベースを使い慣れている誰にとっても、Hive は素晴らしいインターフェースとなりますが、その基礎となる実装の詳細が完全に隠されているわけではないため、リレーショナル・データベースと Hive とで異なるいくつかの点については対処しなければなりません。例えば、最大のパフォーマンスを得るために結合を指定する最適な方法や、Hive に欠けているいくつかの言語機能などです。ただし Hive には、SQL では対処しきれない場合にカスタム・コードを組み込める機能があるだけでなく、入力と出力を処理するための数多くのツールが用意されています。Hive で問題となるのは、UPDATE 文や DELETE 文、単一行の INSERT 操作、そして文字列として扱われる日付や時刻のデータ型などがサポートされない、といった制約です。


HadoopDB

Hadapt 社によって商品化された HadoopDB プロジェクトは、MapReduce が持つスケーラビリティーと、並列データベースが持つ優れたパフォーマンスおよび効率性という、2 つのメリットを組み合わせることを目的としたハイブリッド・システムです。HadoopDB を支える基本概念は、Hadoop をタスク・コーディネーター兼ネットワーク通信層として使用して、複数の単一ノードのデータベース・システム (PostgreSQL) を接続するというものです。HadoopDB では、クエリーは SQL で記述されますが、クエリーを実行する際には MapReduce フレームワークを使用して複数ノードでの並列処理として行われるため、単一のクエリー処理は可能な限り対応するノード・データベースに割り当てられるような形で行われます。

一般に、並列データベース・システムは約 20 年近く市販されており、市場には現在約 10 数種類の実装が出回っています (Teradata、Aster Data、Greenplum など)。これらのシステムが主な目的としているのは、データのロード、索引の作成、クエリーの評価といった各種の処理を並列化することにより、パフォーマンスを向上させることです。一般に、一部のシナリオで MapReduce が並列 RDBMS よりも望ましい手法となる主な理由として、以下のものが挙げられます。

  • 大量のデータをフォーマット設定し、適切なタイミングで並列 RDBMS にロードするのは、難題であると同時に時間がかかるタスクでもあります。
  • 入力データ・レコードが常に同じスキーマに従っているとは限りません。開発者が属性を追加および破棄するだけの柔軟性を必要とする場合はよくあります。また、入力データ・レコードの解釈も時が経つにつれて変わる可能性があります。
  • 大規模なデータ処理には非常に時間がかかるため、障害が発生したとしても分析ジョブを継続させることが重要です。ほとんどの並列 RDBMS には耐障害性サポートが備わっているものの、通常は、クラスターのたった 1 つのノードで障害が発生しただけでも、クエリーを初めからやり直さなければなりません。それとは対照的に、MapReduce はよりグレースフルに障害に対処し、障害によって失われた計算の部分だけを再実行することができます。

MapReduce フレームワークと並列データベース・システムとの比較は、長年論争になっています。これまで、パフォーマンスと開発の複雑さという点で、MapReduce フレームワークの Hadoop 実装と並列 SQL データベース管理システムとの広範な比較が行われてきました。この比較の結果、さまざまなデータ集約型分析タスクを実行する上では、並列データベース・システムのほうが MapReduce よりも遥かにパフォーマンスに優れていることが明らかになりました。その一方、Hadoop 実装は並列データベース・システムに比べて、セットアップして使用するのが簡単でわかりやすくなっています。また、MapReduce はハードウェアに障害が発生した場合に失われる作業の量を最小限にするという点で、並列データベース・システムよりも優れた能力を示しています。さらに MapReduce は (そのオープンソース実装と併せ)、極めてコストのかかる並列 DBMS ソリューションに比べ、遥かにコストがかからないソリューションとなります。

元々、MapReduce フレームワークの主なアプリケーションが焦点としていたのは、Web 索引付け、テキスト分析、グラフ・データ・マイニングなどの極めて大きな非構造化データセットの分析です。最近では MapReduce が着実にデータ分析ツールのデファクト・スタンダードになりつつあるなか、構造化データに対するクエリーにも度々採用されるようになってきています。一方、データウェアハウス・システムのデプロイメント、そして構造化データの分析ジョブのパフォーマンスにおいては、長い間リレーショナル・データベースが優勢を保っています。現在、MapReduce と従来のデータベース・システムを組み合わせて、この両方のメリットを活かすことに対する関心が高まってきています。その具体例として、HadoopDB は、Hadoop のスケジューリングおよびジョブ追跡実装を継承することによって、耐障害性および異種環境での相互運用性の実現を試みる一方、クエリー処理の大部分をデータベース・エンジン内部で行うことによって、並列データベースのパフォーマンス上のメリットを得ようとしています。

図 3 に、データ・ストレージ層 (HDFS) とデータ処理層 (MapReduce フレームワーク) の 2 つの層で構成された HadoopDB のアーキテクチャーを示します。

図 3. HadoopDB のアーキテクチャー
HadoopDB のアーキテクチャーを示す図

このアーキテクチャーでは、HDFS はブロック構造のファイルシステムであり、中央のネーム・ノード (Name Node) によって管理されます。個々のファイルは一定のサイズのブロックに分割されて、クラスター内の複数のデータ・ノード (Data Node) に配布されます。ネーム・ノードは、ブロックのサイズと位置に関するメタデータと、ブロックの複製を保持します。MapReduce フレームワークは単純なマスター・スレーブ・アーキテクチャーに従います。マスターは単一のジョブ・トラッカー (Job Tracker)、スレーブまたはワーカー・ノードはタスク・トラッカー (Task Tracker) です。ジョブ・トラッカー MapReduce はジョブのランタイム・スケジュールを処理し、各タスク・トラッカーの負荷と使用可能なリソースに関する情報を保持します。クラスター内のノードに常駐する独立したデータベース・システムとタスク・トラッカーとの間のインターフェースとなるのは、データベース・コネクター (Database Connector) です。データベース・コネクターはデータベースに接続し、SQL クエリーを実行して、その結果をキーと値のペアとして返します。カタログ (Catalog) コンポーネントは、データベース、それぞれの位置、複製の位置、そしてデータ・パーティショニング・プロパティーに関するメタデータを保持します。データ・ローダー (Data Loader) コンポーネントは、単一ノードのデータをロードする時点で指定のパーティション・キーのデータをグローバルに再パーティション化して、さらに小さい複数のパーティションまたはチャンクに分割します。SMS プランナーは HiveQL トランスレーターを拡張して SQL を MapReduce ジョブに変換すると、これらのジョブが HDFS 内にファイルとして保管されているテーブルに接続します。


Jaql

Jaql は、JSON (JavaScript Object Notation) 用に設計された問い合わせ言語です。JSON はその単純さと、柔軟にモデル化に対応することが理由でよく使用されているデータ・フォーマットです。JSON は単純なものの、フラット・データから準構造化 XML データに至るまでのデータを柔軟に表現します。Jaql は主に、大規模な準構造化データの分析に使用されます。これは関数型かつ宣言型の問い合わせ言語で、上位レベルのクエリーを必要に応じて Map-Reduce ジョブからなる下位レベルのクエリーに作成し直します。これらの Map-Reduce ジョブは、Apache Hadoop プロジェクトを使用して評価されます。Jaql のコア機能には、ユーザー拡張性および並列性が含まれます。Jaql を構成するのは、スクリプト言語とコンパイラー、そしてランタイム・コンポーネントです。Jaql はスキーマがない場合、あるいは部分的なスキーマしかない場合でも処理することができますが、厳格なスキーマ情報がある場合には、そのスキーマを型チェックとパフォーマンスの向上の両方に利用することもできます。リスト 9 のスニペットに、サンプル JSON 文書を記載します。

リスト 9. サンプル JSON 文書
[
  { id: 10,
    name: "Joe Smith",
    email: "JSmith@email.com",
    zip: 85150
  },
  { id: 20,
    name: "Alice Jones",
    email: "AJones@email.com",
    zip: 82116
  }
]

Jaql は、JDM (Jaql Data Model) という極めて単純なデータ・モデルを使用します。JDM の値は、アトム、配列、レコードのいずれかです。サポートされるアトミック型には、文字列、数値、ヌル、日付など、よく使用されている型のほとんどが含まれます。配列とレコードは、任意にネストできる複合型です。さらに詳しく言うと、配列は順序付きの値の集合であり、ベクトル、リスト、セット、またはバッグなどのデータ構造体をモデル化するために使用することができます。レコードは順序のない名前と値のペアの集合で、構造体、辞書、マップをモデル化することができます。その単純さに関わらず、JDM は優れた柔軟性を兼ね備えています。Jaql では JDM を使用して、区切りテキスト・ファイル、JSON ファイル、バイナリー・ファイル、ハードトップのシーケンス・ファイル、リレーショナル・データベース、キー・バリュー型ストア、XML 文書など、入力データと出力データの両方で多種多様なデータ表現を扱うことができます。Jaql では、関数は第一級関数であるため、変数に割り当てることが可能であり、パラメーターとして渡すことも、戻り値として使用することもできるという点で高階関数と見なせます。関数はその中に Jaql のあらゆる式をカプセル化することができ、強力な方法で関数自身をパラメーター化することができるため、再利用を可能にする上で重要な要素となっています。リスト 10 に、一連の演算子からなる Jaql スクリプトの例を記載します。

リスト 10. 一連の演算子からなる Jaql スクリプト
import myrecord;
countFields = fn(records) (
records
-> transform myrecord::names($)
-> expand
-> group by fName = $ as occurrences
into { name: fName, num: count(occurrences) } 
);
read(hdfs("docs.dat"))
-> countFields()
-> write(hdfs("fields.dat"));

上記のスクリプトでは、read 演算子がロー・データ (この例の場合、HDFS (Hadoop Distributed File System) のデータ) を読み取って、Jaql 値に変換します。変換後のJaql 値を処理する countFields サブフローは、フィールド名を抽出して、そのフィールドの出現頻度を計算します。最後に、その結果を write 演算子が HDFS に保管します。表 2 に、Jaql スクリプト言語のコアとなっている式について説明します。

表 2. Jaql スクリプト言語のコアとなる式
説明
transform (変換)transform 式は、関数 (またはプロジェクション) を配列のすべての要素に適用して、新しい配列を生成します。
expand (展開)expand 式はほとんどの場合、入力された配列のネストを解除するために使用されます。
group by (グループ化)SQL での GROUP BY と同様に、Jaql での group by 式は、グループ化式への入力を分割し、各グループに集約式を適用します。
filter (フィルター)filter 式は、特定の述部が true に評価された入力値を保持します。
join (結合)join 式は、2 つ以上の入力の等価結合をサポートします。内部結合および外部結合のすべてのオプションもサポートされます。
union (集約)union 式は、複数の入力配列を 1 つの出力配列にマージする Jaql 関数です。
制御フローJaql で最もよく使われるフロー制御式は、if-then-else 式と block 式です。if-then-else 式は、ほとんどのスクリプトおよびプログラミング言語で使用されている条件式と同様です。block 式が設定するローカル・スコープではローカル変数を宣言することができます。ブロックの最後のステートメントが、ブロックの戻り値を提供します。

全体的に見て、図 4 に示す Jaql アーキテクチャーはほとんどのデータベース・システムと同様です。

図 4. Jaql システム・アーキテクチャー
Jaql システム・アーキテクチャーを示す図

インタープリターまたはアプリケーションからシステムにスクリプトが渡されると、パーサーまたはリライト・エンジンがそのスクリプトをコンパイルします。コンパイルされたスクリプトはさらに説明されるか、I/O 層からのデータに対して評価されます。ストレージ層は、フェデレーテッド・データベースと同じように、さまざまなシステムからのデータにアクセスするための API を提供します。そのシステムの例としては、ローカル・ファイルシステム、分散ファイルシステム (Hadoop の HDFS など)、データベース・システム (DB2、Netezza, HBase など)、さらにはストリーミング・ソース (Web など) といったものが挙げられます。ただし、フェデレーテッド・データベースとは異なり、アクセスするデータのほとんどは、同じクラスター内に保管され、I/O API によってデータ・パーティショニングが表現されます。そのため、評価中にデータ・アフィニティーを使用した並列実行が可能になるというわけです。Jaql はこの柔軟性のほとんどを Hadoop の I/O API から得ています。Jaql は多数の共通ファイル・フォーマット (区切りファイルや JSON テキスト、Hadoop シーケンス・ファイルなど) の読み取り/書き込み操作を行います。データセットと Jaql データ・モデルとをマッピングするカスタム・アダプターを作成するのは簡単です。入力は、スクリプト自体で値を構成することによってさらに単純にすることができます。Jaql インタープリターはスクリプトを、そのスクリプトをコンパイルしたコンピューター上でローカルに評価しますが、MapReduce を使用してリモート・ノードにインタープリターを生成します。Jaql コンパイラーは Jaql スクリプト内で並列実行の可能性を自動的に検出し、それを一連の MapReduce ジョブに変換します。


まとめ

MapReduce は、大規模なコンピューター・クラスターの能力を利用する一般的な方法として登場しました。現在、MapReduce は膨大な量のデータ分析のプラットフォームとしての役割を果たしています。MapReduce を使用することにより、プログラマーは分散実行と耐障害性の詳細を MapReduce フレームワークにトランスペアレントに管理させ、データ中心の考え方でデータ・レコードのセットに変換を適用する方法に集中することができます。実際のところ、多くのプログラマーは上位レベルの宣言型言語 (あるいは SQL ライクな言語) を使って並列化した大規模なデータ分析ジョブを実装し、実行の最適化に関する詳細はすべてバックエンド・エンジンに任せるという方法を選んでいます。この記事では、MapReduce フレームワークを対象とした上位レベルの宣言型インターフェースについての最先端の概要を説明しました。上位レベルでの言語の抽象化によって、そのベースにあるシステムが実行レベルで自動的に最適化を行い、ユーザー・タスクのパフォーマンスを改善できるようにすることで、プログラミングの負担を最小限にしてください。

参考文献

学ぶために

  • Apache Hadoop プロジェクトの Web サイトにアクセスして、このソフトウェア・ライブラリーについて学んでください。Hadoop は、単純なプログラミング・モデルを使用してコンピューターのクラスターで大規模なデータセットを分散処理するためのフレームワークです。
  • Apache HDFS (Hadoop Distributed File System) の Web サイトにアクセスしてください。HDFS は、Hadoop アプリケーションで使用する主要なストレージ・システムです。
  • Apache Pig プロジェクトの Web サイトにアクセスして、大規模データセットの分析プラットフォームについて学んでください。Pig は、データ分析プログラムを表現するための上位レベルの言語と、これらのプログラムを評価するためのインフラストラクチャーで構成されています。
  • Apache Hive プロジェクトの Web サイトにアクセスしてください。Hive は、データ集約、アドホック・クエリー、そして Hadoop 対応のファイルシステムに保管された大規模なデータセットの分析を容易にする、Hadoop のデータウェアハウス・システムです。
  • Cloudera Apache Hadoop Distribution の Web サイトにアクセスして、構造化および非構造化複合データの高度な分析および変換を目的とするこのオープンソースのソフトウェア・パッケージについて学んでください。
  • HadoopDB プロジェクトの Web サイトにアクセスして、分析ワークロードを対象に MapReduce 技術とDBMS 技術をアーキテクチャーに組み合わせた、このハイブリッド・システムについて調べてください。
  • Hadapt - The Adaptive Analytical Platform Web サイトにアクセスして、このビッグ・データ用の初のプラットフォームを調べてください。このプラットフォームでは、複数の構造化データ分析を行うアプリケーションを対象にした 1 つのシステムに、Apache Hadoop とリレーショナル DBMS 技術の利点が結集されています。また、クラウド用に設計された Hadapt は、仮想環境に最適化されています。
  • Aster Data Systems の Web サイトにアクセスして、データの活用方法を学んでください。
  • Jaql の Web サイトにアクセスしてください。JSON (JavaScript Object Notation) 用に設計された Jacl 問い合わせ言語は、主に大規模な準構造化データの分析に使用されます。
  • Apache.org の Hadoop MapReduce チュートリアルを読んでください。
  • クラウドで MapReduce を使用してロード・バランシングを行う」(Kirpal A. Venkatesh、Kishorekumar Neelamegam、R. Revathy 共著、developerWorks、2010年7月): クラウド環境で Hadoop MapReduce フレームワークを実装する方法と、仮想的なロード・バランシングを使って単一ノード・システムと複数ノード・システムのパフォーマンスを改善する方法を学んでください。
  • Big Data Glossary』(Pete Warden 著、O'Reilly Media、ISBN: 1449314597、2011年9月): 最新の 60 の技術革新について説明するガイドで、新たに登場した数々のデータ・ツールを調べてください。
  • Hadoop 第2版』(Tom White 著、オライリー・ジャパン、ISBN: 9784873115030、2010年9月): Apache Hadoop がデータに潜む力を解き放つ仕組みを学んでください。
  • Programming Pig』(Alan Gates 著、O'Reilly Media、ISBN: 1449302645、2011年9月): Hadoop でデータ・フローを並列実行するためのオープンソース・エンジン、Apache Pig の教材兼参考書を読んでください。
  • HadoopDB: An Architectural Hybrid of MapReduce and DBMS Technologies for Analytical Workloads」(Azza Abouzeid 他による共著、VLDB Endowment 議事録 2(1)、2009年8月): この文書では、MapReduce および DBMS 技術の最大の利点を兼ね備えたハイブリッド・システム構築の実現可能性について調査しています。
  • Jaql: A Scripting Language for Large Scale Semi-Structured Data Analysis」(Kevin S. Beyer 他による共著、VLDB Endowment 議事録 4(9)、2011年9月)
  • MapReduce: Simplified Data Processing on Large Clusters」(Jeffrey Dean、Sanjay Ghemawat 共著、OSDI、2004年)
  • SQL/MapReduce: A practical approach to self-describing, polymorphic, and parallelizable user-defined functions」(Eric Friedman、Peter Pawlowski、John Cieslewicz 共著、VLDB Endowment 議事録 2(2)、2009年): UDF に対するこの新しい取り組みの動機と、AsterData Systems の nCluster データベースでの実装について説明している文書です。
  • Building a HighLevel Dataflow System on top of MapReduce: The Pig Experience」(Alan Gates 他による共著、VLDB Endowment 議事録 2(2)、2009年8月): この文書では、Pig を開発する上での課題を説明し、Pig で実行した場合とそのままの Map-Reduce で実行した場合のパフォーマンスの比較結果を報告しています。
  • Pig latin: a not-so-foreign language for data processing」(Christopher Olston 他による共著、SIGMOD カンファレンス、2008年)
  • A comparison of approaches to large-scale data analysis」(Andrew Pavlo 他による共著、SIGMOD カンファレンス、2009年)
  • MapReduce and parallel DBMSs: friends or foes?」(Michael Stonebraker 他による共著、Commun. ACM 53(1)、2010年)
  • Hive - A Warehousing Solution Over a Map-Reduce Framework」(Ashish Thusoo 他による共著、VLDB Endowment 議事録 2(2)、2009年)
  • Data warehousing and analytics infrastructure at Facebook」(Ashish Thusoo、Zheng Shao、Suresh Anthony、Dhruba Borthakur、Namit Jain、Joydeep Sen Sarma、Raghotham Murthy、Hao Liu 共著、SIGMOD カンファレンス、2010年): この文書では、Scribe、Hadoop、Hive が一体となって Facebook で 15 ペタバイト (圧縮後は 2.5 ペタバイト) を超えるデータを保管し、毎日 60 テラバイト (圧縮後は 10 テラバイト) を超える新しいデータをロードするデータウェアハウスを実装できたかを紹介しています。
  • A Survey of Large Scale Data Management Approaches in Cloud Environments」(Sherif Sakr、Anna Liu、Daniel M Batista、Mohammad Alomari 共著、IEEE Communications Surveys and Tutorials ジャーナル 13(3)、2011年): この文書で、研究および業界のコミュニティーの両方でかなりの勢いを得ているデータ集約型アプリケーションをクラウドにデプロイするさまざまな方法とメカニズムの包括的な調査結果を読んでください。
  • オープンソース技術を使用して開発し、IBM の製品と併用するときに役立つ広範囲のハウツー情報、ツール、およびプロジェクト・アップデートについては、developerWorks Open source ゾーンを参照してください。
  • developerWorks Java technology ゾーンで、Java プログラミングのあらゆる側面に関する記事、チュートリアル、フォーラムなどを探してください。
  • さまざまな IBM 製品および IT 業界についての話題に絞った developerWorks の Technical events and webcasts で時代の流れをキャッチしてください。
  • 無料の developerWorks Live! briefing に参加して、IBM の製品およびツールについての情報や IT 業界の動向についての情報を迅速に把握してください。
  • developerWorks ポッドキャストで、ソフトウェア開発者向けの興味深いインタビューとディスカッションを聞いてください。
  • Twitter で developerWorks をフォローしてください。
  • developerWorks demo で、初心者向けの製品のインストールおよびセットアップから熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを調べてください。

製品や技術を入手するために

  • Apache.org から Hadoop 0.20.1 を入手してください。
  • Apache.org から Pig を入手してください。
  • Hadoop MapReduce を入手してください。
  • Hadoop HDFS を入手してください。
  • IBM 試用版ソフトウェアを使用して、開発者専用のソフトウェアを使って次のオープンソース開発プロジェクトを革新してください。IBM 試用版ソフトウェアは、ダウンロードまたは DVD で入手できます。

議論するために

  • developerWorks コミュニティーに参加してください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者によるブログ、フォーラム、グループ、ウィキを調べることができます。developerWorks コミュニティーで、Real world open source グループの構築を手伝ってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Information Management, Java technology
ArticleID=818635
ArticleTitle=MapReduce フレームワークのための SQL ライクな言語を使用する
publish-date=05312012