Main Content

mapreduce

メモリに収まらないデータセットを解析するプログラミング手法

説明

outds = mapreduce(ds,mapfun,reducefun) は map 関数 mapfun を入力データ ストア ds に適用して、それぞれの一意のキーに関連付けられている値を reduce 関数 reducefun に渡します。出力データ ストアは、現在のフォルダーにある .mat ファイルを指す KeyValueDatastore オブジェクトです。

outds = mapreduce(ds,mapfun,reducefun,mr) は、mapreduce の実行時コンフィギュレーション設定をオプションで指定します。mr には、関数 mapreducer の呼び出しの結果が入力されます。通常この引数は Parallel Computing Toolbox™、MATLAB® Parallel Server™ または MATLAB Compiler™ と共に使用されます。詳細については、その他の製品を使用した MapReduce の高速化と展開を参照してください。

outds = mapreduce(___,Name,Value) は、前述の任意の構文を用いて、1 つ以上の Name,Value のペアの引数を使用して追加オプションを指定します。たとえば、'OutputFolder' の後に、出力フォルダーへのパスを指定する文字ベクトルを指定できます。

すべて折りたたむ

mapreduce を使用して、データセット内の一意の航空会社別のフライト数をカウントします。

airlinesmall.csv データセットを使用してデータ ストアを作成します。この 12 MB のデータセットには、到着時間と出発時間を含む、いくつかの航空会社のフライト情報が 29 列に含まれます。この例では、UniqueCarrier (航空会社名) を目的の変数として選択します。'TreatAsMissing' の名前と値のペアを指定してデータストアが 'NA' 値を欠損として取り扱うようにし、'MissingValue' の名前と値のペアを指定して欠損値をゼロで置き換えるようにします。

ds = tabularTextDatastore('airlinesmall.csv','TreatAsMissing','NA',...
    'MissingValue',0);
ds.SelectedVariableNames = 'UniqueCarrier';
ds.SelectedFormats = '%C';

データをプレビューします。

preview(ds)
ans=8×1 table
    UniqueCarrier
    _____________

         PS      
         PS      
         PS      
         PS      
         PS      
         PS      
         PS      
         PS      

データで mapreduce を実行します。map 関数と reduce 関数はデータの各ブロックにある各航空会社名のインスタンス数をカウントし、この中間カウントを結合して最終カウントにします。この方法では、mapreduce が一意のキーを基準にして中間並べ替えを実行します。関数 countMapper と関数 countReducer がこのスクリプトの最後にあります。

outds = mapreduce(ds, @countMapper, @countReducer);
********************************
*      MAPREDUCE PROGRESS      *
********************************
Map   0% Reduce   0%
Map  16% Reduce   0%
Map  32% Reduce   0%
Map  48% Reduce   0%
Map  65% Reduce   0%
Map  81% Reduce   0%
Map  97% Reduce   0%
Map 100% Reduce   0%
Map 100% Reduce  10%
Map 100% Reduce  21%
Map 100% Reduce  31%
Map 100% Reduce  41%
Map 100% Reduce  52%
Map 100% Reduce  62%
Map 100% Reduce  72%
Map 100% Reduce  83%
Map 100% Reduce  93%
Map 100% Reduce 100%
readall(outds)
ans=29×2 table
       Key          Value  
    __________    _________

    {'AA'    }    {[14930]}
    {'AS'    }    {[ 2910]}
    {'CO'    }    {[ 8138]}
    {'DL'    }    {[16578]}
    {'EA'    }    {[  920]}
    {'HP'    }    {[ 3660]}
    {'ML (1)'}    {[   69]}
    {'NW'    }    {[10349]}
    {'PA (1)'}    {[  318]}
    {'PI'    }    {[  871]}
    {'PS'    }    {[   83]}
    {'TW'    }    {[ 3805]}
    {'UA'    }    {[13286]}
    {'US'    }    {[13997]}
    {'WN'    }    {[15931]}
    {'AQ'    }    {[  154]}
      ⋮

map 関数 countMapper は、データがカテゴリカルであるという事実に基づいて使用されます。関数 countcats と関数 categories は入力データの各ブロックで使用され、航空会社名とそれに関連するカウントからなるキー/値のペアを生成します。

function countMapper(data, info, intermKV)
% Counts unique airline carrier names in each block.
a = data.UniqueCarrier;
c = num2cell(countcats(a));
keys = categories(a);
addmulti(intermKV, keys, c)
end

reduce 関数 countReducer は map 関数により生成された中間データを読み込み、すべてのカウントを合計して、航空会社ごとに 1 つの最終カウントを生成します。

function countReducer(key, intermValIter, outKV)
% Combines counts from all blocks to produce final counts.
count = 0;
while hasnext(intermValIter)
    data = getnext(intermValIter);
    count = count + data;
end
add(outKV, key, count)
end

入力引数

すべて折りたたむ

入力データ ストア。datastore オブジェクトとして指定します。関数 datastore を使用してデータセットから datastore オブジェクトを作成します。

mapreduce は、確定的なデータ ストアでのみ機能します。つまり、データ ストアで read を使用する場合は、reset によってデータ ストアをリセットし、もう一度データ ストアを読み取ります。これで、返されるデータは両方とも同じになるはずです。確定的でないデータ ストアについて mapreduce の計算を行うと、予期しない結果になる場合があります。詳細については、ファイル形式またはアプリケーション用のデータ ストアの選択を参照してください。

map 関数の関数ハンドル。mapfun は入力データストア ds からブロックを受け取り、関数 add および関数 addmulti を使用してキーと値のペアを中間の KeyValueStore オブジェクトに追加します。mapreduce が map 関数を呼び出す回数は、datastore 内のブロック数と同じです (ブロック数はデータストアの ReadSize プロパティにより決定されます)。

map 関数への入力は、datainfo および intermKVStore であり、mapreduce はこれらを自動的に作成して map 関数に渡します。

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

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

map 関数のテンプレートの例を、次に示します。

function myMapper(data, info, intermKVStore)
%do a calculation with the data block
add(intermKVStore, key, value)
end

例: @myMapper

データ型: function_handle

reduce 関数の関数ハンドル。mapreduce は、map 関数によってそれぞれの一意のキーが中間の KeyValueStore に追加されるたびに reducefun を呼び出します。各呼び出しで、mapreduce はアクティブなキーに関連付けられている値を ValueIterator オブジェクトとして reducefun に渡します。関数 reducefun は関数 hasnext および getnext を使用して、各キーの値をループします。それから、計算の実行後にキーと値のペアを最終的な出力に書き込みます。

reduce 関数への入力は、intermKeyintermValIter および outKVStore であり、mapreduce はこれらを自動的に作成して reduce 関数に渡します。

  • intermKey は、中間の KeyValueStore オブジェクトのアクティブなキーです。mapreduce が reduce 関数を呼び出すたびに、中間の KeyValueStore オブジェクトのキーから新しい一意のキーが指定されます。

  • intermValIter は、アクティブなキー intermKey に関連付けられた ValueIterator です。この ValueIterator オブジェクトには、アクティブなキーに関連付けられたすべての値が含まれます。関数 hasnextgetnext を使用して値をスクロールします。

  • outKVStore は、reduce 関数がキーと値のペアを追加しなければならない最終的な KeyValueStore オブジェクトです。mapreduce は、outKVStore 出力のキーと値のペアを取りこんで出力データ ストア outds に返します。これは、既定では KeyValueDatastore オブジェクトです。reduce 関数の呼び出しで、最終的なキーと値のペアが outKVStore にまったく追加されなかった場合は、 出力データ ストアは空です。

reduce 関数のテンプレートの例を、次に示します。

function myReducer(intermKey, intermValIter, outKVStore)
while hasnext(intermValIter)
    X = getnext(intermValIter);
    %do a calculation with the current value, X
end
add(outKVStore, key, value)
end

例: @myReducer

データ型: function_handle

実行環境。MapReducer オブジェクトとして指定します。mr は関数 mapreducer の呼び出し結果です。既定の mr 引数は gcmr の呼び出しであり、mapreduce の既定のグローバル実行環境を使用します (MATLAB の既定値は mapreducer(0) で、SerialMapReducer オブジェクトを返します)。

メモ

この設定は mapreduce の実行環境を指定します。お使いのローカル コンピューターで mapreduce を実行する場合は必要ありません。詳細については、その他の製品を使用した MapReduce の高速化と展開を参照してください。

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

例: outds = mapreduce(ds, @mapfun, @reducefun, 'Display', 'off', 'OutputFolder', 'C:\Users\username\Desktop')

データ ストア出力の種類。'Binary' または 'TabularText' として指定します。'Binary' の既定の設定では、出力フォルダーにあるバイナリ (.mat または .seq) ファイルを指す KeyValueDatastore 出力データ ストアを返します。'TabularText' オプションは、出力フォルダーにある .txt ファイルを指す tabularTextDatastore 出力データ ストアを返します。

次の表に、出力の各種類の詳細を示します。

'OutputType'データ ストア出力の種類データ ストアが指すファイルの種類reduce 関数で追加可能な値reduce 関数で追加可能なキー詳細
'Binary' (既定)KeyValueDatastore.mat (Hadoop® に対する実行時は .seq)任意の有効な MATLAB オブジェクト文字ベクトル、string、または NaN、複素数、logical、スパース以外の数値スカラー。N/A
'TabularText'TabularTextDatastore.txt文字ベクトル、string、または NaN、複素数、logical、スパース以外の数値スカラー。文字ベクトル、string、または NaN、複素数、logical、スパース以外の数値スカラー。
  • ファイルは UTF-8 でエンコードされています。

  • キーと値はタブ (\t) で区切られています。

  • 行の区切り記号は Windows® では \r\n、Linux®Mac では \n です。

データ型: char | string

mapreduce 出力の保存先フォルダー。ファイル パスとして指定します。既定の出力フォルダーは現在のフォルダー pwd です。完全修飾パスまたは現在のフォルダーに対する相対パスを使用すると、別のパスを指定できます。

例: mapreduce(..., 'OutputFolder', 'MyOutputFolder\Results') は、出力の現在のフォルダーに対する相対ファイル パスを指定します。

データ型: char | string

コマンド ラインの進行状況出力の切り替え。'on' または 'off' として指定します。既定値は 'on' であり、mapreduce は、実行のマップとリデュースのフェーズ中の進行状況をコマンド ウィンドウに表示します。

データ型: char | string

出力引数

すべて折りたたむ

出力データ ストア。KeyValueDatastore または TabularTextDatastore オブジェクトとして返されます。既定では、outds は、現在のフォルダーにある .mat ファイルを指す KeyValueDatastore オブジェクトです。'OutputType''OutputFolder'Name,Value のペア引数を使用して、tabularTextDatastore オブジェクトを返すか、出力ファイルの場所をそれぞれ変更します。

mapreduceoutds 内のキーと値のペアを並べ替えません。mapreduce を他の製品と共に使用する場合、表示順が異なる場合があります。

outds の内容を表示するには、datastore の関数 previewread または readall を使用します。

ヒント

  • mapreduce アルゴリズムをデバッグする場合、キーと値のペアが異なるフェーズでどのように移動するかを確認するのは有益なことです。データの移動を確認するには、map 関数と reduce 関数内にブレークポイントを設定します。ブレークポイントは mapreduce の実行を停止して、KeyValueStore または ValueIterator のような関連する変数の現在の状態を確認できるようにします。詳細については、MapReduce アルゴリズムのデバッグを参照してください。

  • 任意のプラットフォーム上で mapreduce のパフォーマンスを最適化するには、以下の推奨事項を実装してください。

    • map 関数への呼び出し回数を最小限に抑えます。一番簡単な方法は、入力データ ストアの ReadSize プロパティの値を大きくすることです。その結果、mapreduce が map 関数に渡すデータのブロック サイズが大きくなり、データストアの最後に到達するまでの読み取り回数が少なくなります。

    • map 関数と reduce 関数の間で受け渡される中間データの量を減らします。たとえば、map 関数内に unique を使用して、類似したキーを組み合わせることができます。この手法の例は、MapReduce を使用するグループごとの平均の計算を参照してください。

拡張機能

バージョン履歴

R2014b で導入