このトピックでは、MapReduceジョブが実行されるローカルモードと分散モードの違いについて説明します。 また、ローカルモードのMapReduceジョブの例も示します。
ローカルモードの概要
ジョブをローカルモードで実行する前に、JARコマンドで -localオプションを指定して、ジョブの実行をシミュレートできます。 これにより、ジョブに対してローカルデバッグを実行できます。
ジョブの実行中に、クライアントは入力テーブルのメタデータとデータ、出力テーブルのメタデータ、およびローカルデバッグに必要なリソースをMaxComputeからダウンロードします。 ダウンロードされたデータは、warehouseという名前のローカルディレクトリに保存されます。
ジョブの完了後、計算結果はwarehouseディレクトリのファイルに保存されます。 入力テーブルと必要なリソースがwarehouseディレクトリにダウンロードされた場合、MapReduceは、データを再度ダウンロードするのではなく、次回ディレクトリ内のデータとファイルを直接参照します。
ローカルモードと分散モードの違い
ローカルモードで実行されるMapReduceジョブは、データを処理するために複数のマップおよび縮小タスクを開始します。 これらのタスクは順番に実行されます。
シミュレートされた実行プロセスは、次の点で実際の分散実行プロセスとは異なります。
入力テーブルの行: 最大100行のデータをローカルモードでダウンロードできます。
リソース使用量: 分散モードでは、MaxComputeは参照できるリソースのサイズを制限します。 詳細については、「MapReduceの制限」をご参照ください。 しかしながら、ローカルモードにおけるリソースのサイズに制限は課されない。
セキュリティ: MaxCompute MapReduceとユーザー定義関数 (UDF) は、分散モードのJavaサンドボックスによって制限されます。 ただし、ローカルモードでは制限はありません。
例
次のコードは、ローカルモードのMapReduceジョブの例を示しています。
odps:my_project> jar -l com.aliyun.odps.mapred.example.WordCount wc_in wc_out
Summary:
counters: 10
map-reduce framework
combine_input_groups=2
combine_output_records=2
map_input_bytes=4
map_input_records=1
map_output_records=2
map_output_[wc_out]_bytes=0
map_output_[wc_out]_records=0
reduce_input_groups=2
reduce_output_[wc_out]_bytes=8
reduce_output_[wc_out]_records=2
OKWordCountのサンプルコードの詳細については、「WordCount」をご参照ください。
ローカルデバッグコマンドを初めて実行する場合は、コマンドの実行後に現在のパスにwarehouseという名前のディレクトリが作成されます。 次のコードは、warehouseのディレクトリ構造を示しています。
<warehouse>
|____my_project (project directory)
|____ <__tables__>
| |__wc_in (table data directory)
| | |____ data (file)
| | |
| | |____ <__schema__> (file)
| |__wc_out (table data directory)
| |____ data (file)
| |
| |____ <__schema__> (file)
|
|____ <__resources__>
|
|___table_resource_name (table resource)
| |____<__ref__>
|
|___ file_resource_name (file resource)my_projectと同じレベルのディレクトリはプロジェクトを示します。wc_inおよびwc_outと同じレベルのディレクトリは、データテーブルを示します。 JARコマンドを使用して読み書きしたテーブルデータは、このレベルのディレクトリにダウンロードされます。<__ schema __> ファイルには、テーブルのメタデータが格納されます。 次のコードは、ファイル形式を定義します。
project=local_project_name table=local_table_name columns=col1_name:col1_type,col2_name:col2_type partitions=p1:STRING,p2:BIGINT -- In this example, you do not need to specify this field.列の名前とデータ型はコロン (:) で区切ります。 列はコンマ (,) で区切ります。 プロジェクト名とテーブル名
project_name.table_nameは、<__ schema __> ファイルの先頭で宣言する必要があります。 宣言と列の定義はコンマ (,) で区切ります。 例:project_name.table_name,col1_name:col1_type,col2_name:col2_type,…tablesディレクトリのdataファイルには、テーブルデータが格納されます。 列数と列データは、_schema_ ファイルの定義と一致する必要があります。 列はコンマ (,) で区切ります。wc_inディレクトリの _schema_ ファイルには、次のデータが含まれています。my_project.wc_in,key:STRING,value:STRINGdataファイルには次のデータが含まれています。
0,2クライアントは、MaxComputeからテーブルのメタデータとデータの一部をダウンロードし、データを上記のファイルに保存します。 次回このサンプルプログラムを実行すると、クライアントは
wc_inディレクトリのデータを再度ダウンロードするのではなく、直接使用します。説明MaxComputeからダウンロードできるのは、ローカルモードで実行されるMapReduceジョブのみです。
wc_outディレクトリの _schema_ ファイルには、次のデータが含まれています。my_project.wc_out,key:STRING,cnt:BIGINTdataファイルには次のデータが含まれています。
0,1 2,1クライアントはMaxComputeから
wc_outテーブルのメタデータをダウンロードし、データを _schema_ ファイルに保存します。 ジョブが完了すると、結果はデータファイルに保存されます。説明_schema_ およびdataファイルを編集して、テーブルディレクトリにファイルを保存することもできます。
ジョブをローカルモードで実行し、クライアントがテーブルディレクトリが存在することを検出した場合、クライアントはこのテーブルの情報をMaxComputeからダウンロードしません。 ローカルテーブルディレクトリには、MaxComputeに存在しないテーブルを含めることができます。