reduceメソッドには、グローバルな入力データ型と出力データ型があります。その概略構造は次のとおりです。
1 resultValue = grid.reduce(
2 job distribution mode,
3 executable logic function,
4 split function,
5 collect function);
- タスクの結果値は、reduce関数の戻り値に直接割り当てられます。グリッドは、ジョブが送信される対応するグリッドです。ここでは、複数のグリッドを定義して並列に存在させることができます。
- ジョブ分散設定はここで定義されます。ジョブ分散のパラメーターには、次の3つのオプションがあります。-GridClosureCallMode.BALANCE–バランスの取れた(ラウンドロビン?)ジョブの分散-GridClosureCallMode.BROADCAST –すべてのノードがすべてのジョブを処理します-GridClosureCallMode.SPREAD –すべてのジョブがランダムに分散されます
- アトミック論理関数はここで定義されます。この部分はジョブと呼ばれます。ノードに送信され、処理され、グローバル結果の一部が含まれます。サポートされている入力および出力データ型が定義されています。GridGainは、この関数に必要なすべてのライブラリの配布もサポートしています。つまり、必要なすべてのライブラリがジョブに付属しているため、マスターノードはすべてのノードがローカルで使用できるライブラリの使用に限定されません。もちろん、これによりデータトラフィックが増加します。
- 入力データはノードに分散する必要があります。各関数には、split関数からのデータセットの1つが提供されます。データの内訳は、対応するデータ型の配列リストに格納されます。実装結果により、低レベルのデータ型のみがサポートされます(GridGainによると、高レベルのデータも転送可能である必要があります)。PDFや画像などのより複雑なデータを転送するには、バイト配列へのカプセル化を行う必要があります。
- マスターノードはこの関数を使用して、結果のパーツを受け取り、それらを最終結果に再アセンブルします。
簡単な例:(メモリ操作のみでCPUを集中的に使用しないため、グリッドをあまり利用しないため、単一実行の改善を期待しないでください)
private static int countLettersReducer(String phrase) throws GridException {
// final GridLogger log = grid.log();
int letterCount = 0;
// Execute Hello World task.
try {
@SuppressWarnings("unchecked")
int letterCnt =
grid.reduce(GridClosureCallMode.BALANCE,
// input: string
// output: integer
new GridClosure<String, Integer>() {
private static final long serialVersionUID = 1L;
// Create executable logic block for a job part
@Override
public Integer apply(String word) {
// Print out a given word, just so we can
// see which node is doing what.
// System.out.println(">>> Calculating for word: " + word);
// Return the length of a given word, i.e. number of
// letters.
return word.length();
}
},
// split tasks for single jobs according to this function
// split at linebreaks
Arrays.asList(phrase.split("\n")),
// Collection of words.
// Collect the results from each job of the nodes
//input and output is integer
new GridReducer<Integer, Integer>() {
/**
*
*/
private static final long serialVersionUID = 1L;
private int sum;
@Override
public boolean collect(Integer res) {
sum += res;
return true; // True means continue collecting until
// last result.
}
// return the collected results
@Override
public Integer apply() {
return sum;
}
});
letterCount = letterCnt;
} catch (Exception e) {
}
return letterCount;
}