reduce 方法具有全局输入和输出数据类型。其结构示意图如下:
1 resultValue = grid.reduce(
2 job distribution mode,
3 executable logic function,
4 split function,
5 collect function);
- 任务的结果值直接赋值给reduce函数的返回值。Grid 是对应的网格,作业发送到的地方。这里可以定义多个网格并并行存在。
- 作业分配设置在此处定义。作业分配的参数提供三个选项: -GridClosureCallMode.BALANCE - 平衡(循环?)作业分布 -GridClosureCallMode.BROADCAST - 所有节点处理所有作业 -GridClosureCallMode.SPREAD - 所有作业随机分布
- 原子逻辑函数在这里定义。这部分称为作业;它被发送到一个节点,处理并包含全局结果的一部分。它定义了支持的输入和输出数据类型。GridGain 还支持开箱即用地分发此功能所需的所有库。这意味着主节点不限于使用所有节点都在本地可用的库,因为所有必要的库都随作业一起提供。这当然会产生更多的数据流量。
- 输入数据需要分发到节点。每个函数都提供有来自 split 函数的数据集之一。数据的细分存储在具有相应数据类型的数组列表中。由于实现结果,仅支持低级数据类型(根据 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;
}