GridGain:MapReduce与节点本地数据处理?

时间:2015-02-19 10:04:48

标签: mapreduce gridgain

我正在尝试对大型分布式数据集执行一些数值计算。这些算法很好地适应了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时进行重新平衡时,部分数据可以被处理零次或多次。

1 个答案:

答案 0 :(得分:1)

GridGain Open Source(现在是Apache Ignite)具有ComputeTask API,它具有map()和reduce()方法。如果您正在寻找reduce()方法,那么ComputeTask绝对是适合您的API。

目前你的实施还可以。 Apache Ignite正在添加一项功能,在迁移完成之前,不会将节点视为主节点。它应该很快就会到来。