ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

map 関数の作成

MapReduce における map 関数の役割

mapreduce は、データのチャンクを受け取って中間結果を出力する入力 map 関数と、中間結果を読み取って最終結果を生成する入力 reduce 関数の両方を必要とします。したがって、map 関数および reduce 関数が独立して実行できるように、計算を 2 つの関係する部分に分割するのは自然なことです。たとえば、データセット内の最大値を検索する入力は、map 関数で各データのチャンク内の最大値を検索し、次に reduce 関数で、すべての中間値の最大値から単一の最大値を検索することができます。

次の図に、mapreduce アルゴリズムの Map フェーズを示します。

mapreduce アルゴリズムの Map フェーズには次のステップがあります。

  1. mapreduce は、関数 read を入力データ ストアに対して使用してデータのチャンクを 1 つ読み取り、そのチャンクを処理するために map 関数を呼び出します。

  2. 次に、map 関数は個々のデータのチャンクを処理して、関数 add または addmulti を使用して中間 KeyValueStore オブジェクトに 1 つ以上のキーと値のペアを追加します。

  3. mapreduce はこのプロセスを入力データ ストア内の各データのチャンクに対して繰り返すので、map 関数の呼び出し回数の合計は、データのチャンク数と同じです。データ ストアの ReadSize プロパティによって、データ チャンクの数が決まります。

mapreduce アルゴリズムの Map フェーズは、map 関数が入力データ ストア内の各データのチャンクを処理した時に完了します。mapreduce アルゴリズムのこのフェーズの結果は、map 関数が追加したすべてのキーと値のペアを含む KeyValueStore オブジェクトです。Map フェーズの後、mapreduceKeyValueStore オブジェクト内のすべての値を一意なキーでグループ化して、Reduce フェーズの準備をします。

map 関数の要件

mapreduce は、入力データ ストア内の各データのチャンクに対して、自動的に map 関数を呼び出します。map 関数は、この自動呼出しの際に適切に実行できるように、特定の基本的な要件を満たさなければなりません。これらの要件は、mapreduce アルゴリズムの Map フェーズ中にデータが適切に移動することを集合的に保証します。

map 関数への入力は、datainfo および intermKVStore です。

  • data および info は、入力 datastore に対する関数 read の呼び出しの結果です。これは、map 関数の呼び出しの前に毎回 mapreduce が自動的に実行します。

  • intermKVStore は、map 関数がキーと値のペアを追加する必要のある中間 KeyValueStore オブジェクトの名前です。関数 add および addmulti は、このオブジェクト名を使用してキーと値のペアを追加します。map 関数が intermKVStore オブジェクトにキーと値のペアをまったく追加しなかった場合は、mapreduce は reduce 関数を呼び出さず、結果のデータ ストアは空になります。

map 関数に関するこれらの基本要件に加えて、map 関数によって追加されるキーと値のペアも、以下の条件を満たさなければなりません。

  1. キーは数値スカラーまたは文字ベクトルでなければなりません。数値キーに NaN、複素数、論理値、スパースは使用できません。

  2. map 関数で追加されるキーはすべて同じクラスでなければなりません。

  3. 値には、有効な MATLAB® データ型を始めとする任意の MATLAB オブジェクトが使用できます。

メモ

上記のキーと値のペアの要件は、mapreduce を使用する製品によって異なる場合があります。使用する製品のドキュメンテーションで、キーと値のペアに関する製品固有の要件を確認してください。

map 関数の例

以下の例には、toolbox/matlab/demos フォルダーの mapreduce の例で使用される map 関数が含まれます。

同一の map 関数

mapreduce から渡されたものをそのまま返す map 関数は、"同一のマッパー" と呼ばれます。同一のマッパーは、reduce 関数で計算を実行する前に、一意なキーによる値のグループ化を利用する場合に便利です。identityMapper.m マッパー ファイルは、サンプル ファイル TSQRMapReduceExample.m で使用されるマッパーの 1 つです。

type identityMapper.m
function identityMapper(data, info, intermKVStore)
% Mapper function for the MapReduce TSQR example.
%
% This mapper function simply copies the data and add them to the
% intermKVStore as intermediate values.

% Copyright 2014 The MathWorks, Inc.

x = data.Value{:,:};
add(intermKVStore,'Identity', x);

単純な map 関数

同一でないマッパーの最も簡単な例の 1 つに maxArrivalDelayMapper.m があります。これは、サンプル ファイル MaxMapReduceExample.m のマッパーです。このマッパーは、入力データの各チャンクに対して、最大到着遅延時間を計算してキーと値のペアを中間 KeyValueStore に追加します。

type maxArrivalDelayMapper.m
function maxArrivalDelayMapper (data, info, intermKVStore)
% Mapper function for the MaxMapreduceExample.

% Copyright 1984-2014 The MathWorks, Inc. 

% Data is an n-by-1 table of the ArrDelay. As the data source is tabular,
% the return of read is a table object.
partMax = max(data.ArrDelay);
add(intermKVStore, 'PartialMaxArrivalDelay',partMax);

高度な map 関数

より高度なマッパーの例には、statsByGroupMapper.m があります。これは、サンプル ファイル StatisticsByGroupMapReduceExample.m のマッパーです。このマッパーは、入れ子関数を使用して、入力データの各チャンクに対していくつかの統計量 (カウント、平均、分散など) を計算し、いくつかのキーと値のペアを中間 KeyValueStore オブジェクトに追加します。また、このマッパーは 4 つの入力引数を使用しますが、mapreduce は 3 つの入力引数をもつ map 関数しか受け入れません。これを回避するためには、例で概説しているように、mapreduce の呼び出しの際に無名関数を使用して追加のパラメーターを渡します。

type statsByGroupMapper.m
function statsByGroupMapper(data, ~, intermKVStore, groupVarName)
% Mapper function for the StatisticsByGroupMapReduceExample.

% Copyright 2014 The MathWorks, Inc.

% Data is a n-by-3 table. Remove missing values first
delays = data.ArrDelay;
groups = data.(groupVarName);
notNaN =~isnan(delays);
groups = groups(notNaN);
delays = delays(notNaN);

% find the unique group levels in this chunk
[intermKeys,~,idx] = unique(groups, 'stable');

% group delays by idx and apply @grpstatsfun function to each group
intermVals = accumarray(idx,delays,size(intermKeys),@grpstatsfun);
addmulti(intermKVStore,intermKeys,intermVals);

function out = grpstatsfun(x)
n = length(x); % count
m = sum(x)/n; % mean
v = sum((x-m).^2)/n; % variance
s = sum((x-m).^3)/n; % skewness without normalization
k = sum((x-m).^4)/n; % kurtosis without normalization
out = {[n, m, v, s, k]};

その他の map 関数

map 関数または reduce 関数の一般的なプログラミング パターンについての詳細は、MapReduce での効果的なアルゴリズムの構築を参照してください。

参考

| | |

関連するトピック

この情報は役に立ちましたか?