我正在尝试对大型分布式数据集执行一些数值计算。这些算法很好地适应了MapReduce模型,并且与输入数据相比,地图步骤输出的附加属性很小。数据可以被认为是只读的,并且是静态分布在节点上的(除了在故障转移时重新平衡)。请注意,这与标准字计数示例有些相反,其中输入数据被发送到执行映射步骤的节点。
这意味着映射步骤应在所有节点上并行执行,处理每个节点的本地数据,同时可以接受将映射步骤的输出发送到一个节点以进行缩减步骤。
使用GridGain实现此目的的最佳方法是什么?
似乎早期版本的GridGain中的reduce
/ GridCache
接口上有GridCacheProjection
(..)方法,但这种方法不再存在。有替代品吗?我正在考虑一种机制,它采用地图闭包并执行它分布在每个数据完全一次,同时避免通过网络复制任何输入数据。
到目前为止我提出的(有点手动)方法如下:
public class GridBroadcastCountDemo {
public static void main(String[] args) throws GridException {
try (Grid grid = GridGain.start(CONFIG_FILE)) {
GridFuture<Collection<Integer>> future = grid.forRemotes().compute().broadcast(new GridCallable<Integer>() {
@Override
public Integer call() throws Exception {
GridCache<Integer, float[]> cache = grid.cache(CACHE_NAME);
int count = 0;
for (float[] array : cache.primaryValues()) {
count += array.length;
}
return count;
}
});
int totalCount = 0;
for (int count : future.get()) {
totalCount += count;
}
// expect size of input data
System.out.println(totalCount);
}
}
}
但是,无法保证每种数据只需使用此方法处理一次。例如。当在执行GridCallable
时进行重新平衡时,部分数据可以被处理零次或多次。
答案 0 :(得分:1)
GridGain Open Source(现在是Apache Ignite)具有ComputeTask API,它具有map()和reduce()方法。如果您正在寻找reduce()方法,那么ComputeTask绝对是适合您的API。
目前你的实施还可以。 Apache Ignite正在添加一项功能,在迁移完成之前,不会将节点视为主节点。它应该很快就会到来。