このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
mapreduce
は、データのブロックを受け取って中間結果を出力する入力 map 関数と、中間結果を読み取って最終結果を生成する入力 reduce 関数の両方を必要とします。したがって、map 関数および reduce 関数が独立して実行できるように、計算を 2 つの関係する部分に分割するのは自然なことです。たとえば、データセット内の最大値を求めるために、map 関数は入力データの各ブロック内の最大値を求めることができ、次に、reduce 関数はすべての中間最大値の中から単一の最大値を求めることができます。
次の図に、mapreduce
アルゴリズムの Map フェーズを示します。
mapreduce
アルゴリズムの Map フェーズには次のステップがあります。
mapreduce
は,関数read
を入力データストアに対し使用してデータのブロックを 1 つ読み取り、そのブロックを処理するために map 関数を呼び出します。
次に、map 関数は個々のデータのブロックを処理し、関数add
または関数addmulti
を使用して中間KeyValueStore
オブジェクトに 1 つ以上のキーと値のペアを追加します。
mapreduce
はこのプロセスを入力データストア内のデータのブロックごとに繰り返すため、map 関数の呼び出し回数の合計は、データのブロック数と同じになります。データストアのReadSize
プロパティによってデータ ブロックの数が決まります。
mapreduce
アルゴリズムの Map フェーズは、map 関数が入力データストア内のデータの各ブロックを処理すると完了します。mapreduce
アルゴリズムのこのフェーズの結果は、map 関数が追加したすべてのキーと値のペアを含むKeyValueStore
オブジェクトです。Map フェーズの後、mapreduce
はKeyValueStore
オブジェクト内のすべての値を一意なキーでグループ化して、Reduce フェーズの準備をします。
mapreduce
は、入力データストア内のデータのブロックごとに、自動的に map 関数を呼び出します。map 関数は、この自動呼出しの際に適切に実行できるように、特定の基本的な要件を満たさなければなりません。これらの要件は、mapreduce
アルゴリズムの Map フェーズ中にデータが適切に移動することを集合的に保証します。
map 関数への入力は、data
、info
およびintermKVStore
です。
data
およびinfo
は、入力データストアに対して関数read
を呼び出した結果です。この呼び出しは、map 関数を呼び出す前に毎回mapreduce
が自動的に実行します。
intermKVStore
は、map 関数がキーと値のペアを追加する必要のある中間KeyValueStore
オブジェクトの名前です。関数add
およびaddmulti
は、このオブジェクト名を使用してキーと値のペアを追加します。map 関数がintermKVStore
オブジェクトにキーと値のペアをまったく追加しなかった場合は、mapreduce
は减少関数を呼び出さず,結果のデータストアは空になります。
map 関数に関するこれらの基本要件に加えて、map 関数によって追加されるキーと値のペアも、以下の条件を満たさなければなりません。
キーは数値スカラー、文字ベクトル、または string でなければなりません。数値キーにNaN
、複素数、論理値、スパースは使用できません。
map 関数で追加されるキーはすべて同じクラスでなければなりません。
値には、有効な MATLAB®データ型を始めとする任意の MATLAB オブジェクトが使用できます。
メモ
上記のキーと値のペアの要件は、mapreduce
を使用する製品によって異なる場合があります。使用する製品のドキュメンテーションで、キーと値のペアに関する製品固有の要件を確認してください。
以下は、mapreduce
の例に使用されているいくつかの分かりやすい map 関数です。
mapreduce
から渡されたものをそのまま返す map 関数は、"同一のマッパー" と呼ばれます。同一のマッパーは、reduce 関数で計算を実行する前に、一意なキーによる値のグループ化を利用する場合に便利です。identityMapper
マッパー ファイルは、例MapReduce を使用する tall QR (TSQR) 行列の因数分解で使用されているマッパーの 1 つです。
functionidentityMapper(data, info, intermKVStore)% This mapper function simply copies the data and add them to the% intermKVStore as intermediate values.x = data.Value{:,:}; add(intermKVStore,'Identity', x);end
同一でないマッパーの最も単純な例の 1 つにmaxArrivalDelayMapper
があります。これは、例MapReduce を使用した最大値の検索のマッパーです。このマッパーは、入力データの各チャンクに対して、最大到着遅延時間を計算してキーと値のペアを中間KeyValueStore
に追加します。
functionmaxArrivalDelayMapper (data, info, intermKVStore) partMax = max(data.ArrDelay); add(intermKVStore,'PartialMaxArrivalDelay',partMax);end
より高度なマッパーの例にはstatsByGroupMapper
があります。これは、例MapReduce を使用してグループごとの要約統計を計算するのマッパーです。このマッパーは、入れ子関数を使用して、入力データの各チャンクに対していくつかの統計量 (カウント、平均、分散など) を計算し、いくつかのキーと値のペアを中間KeyValueStore
オブジェクトに追加します。また、このマッパーは 4 つの入力引数を使用しますが、mapreduce
は 3 つの入力引数をもつ map 関数しか受け入れません。これを回避するには、例で概説しているように、mapreduce
の呼び出しの際に無名関数を使用して追加のパラメーターを渡します。
functionstatsByGroupMapper(data, ~, intermKVStore, groupVarName)% Data is a n-by-3 table. Remove missing values firstdelays = data.ArrDelay; groups = data.(groupVarName); notNaN =~isnan(delays); groups = groups(notNaN); delays = delays(notNaN);%在这一块找到独特的组织水平[intermKeys,~,idx] = unique(groups,'stable');% Group delays by idx and apply @grpstatsfun function to each groupintermVals = accumarray(idx,delays,size(intermKeys),@grpstatsfun); addmulti(intermKVStore,intermKeys,intermVals);functionout = grpstatsfun(x) n = length(x);% countm = sum(x)/n;% meanv = sum((x-m).^2)/n;% variances = sum((x-m).^3)/n;% skewness without normalizationk = sum((x-m).^4)/n;% kurtosis without normalizationout = {[n, m, v, s, k]};endend
map 関数または reduce 関数の一般的なプログラミング パターンについての詳細は、MapReduce での効果的なアルゴリズムの構築を参照してください。
mapreduce
|tabularTextDatastore
|add
|addmulti