如何使用Hazelcast在群集中的两个实例中运行大任务

时间:2015-09-25 07:34:09

标签: java hazelcast hazelcast-imap

我想在使用Hazelcast在群集中相互共享的两个实例中运行java任务。这样,任务可以更快地完成,而不是在单个实例中运行。请帮忙!

1 个答案:

答案 0 :(得分:2)

您发布的问题不是很清楚您的问题。你的大任务可能是做以下事情。

  1. 处理以hazelcast分布式数据存储的数据(数据密集) 结构。
  2. 数字运算(CPU密集)操作有限或无 来自hazelcast的数据。
  3. 在这两种情况下,您都可以在hazelcast中使用ExecutorService的分布式实现。见以下链接:

    http://docs.hazelcast.org/docs/3.5/javadoc/com/hazelcast/core/IExecutorService.html

    对于案例1)因为hazelcast将数据划分为多个节点(实例),所以您可以通过调用executeOnKeyOwner()方法在密钥所有者上执行任务,如下所示。

    示例代码

        HazelcastInstance hz = Hazelcast.newHazelcastInstance();
        Map<Integer, String> map = hz.getMap("yourMap");
        for (int key = 0; key < 100; key++)
            map.put(key, "someValue");
        IExecutorService executor = hz.getExecutorService("executor");
        for (Integer key : map.keySet())
            executor.executeOnKeyOwner(new YourBigTask(), key);
    

    YourBigTask是您的大任务类&#34;将实现RunnableSerializable接口,并在run()方法中进行必要的处理。如果您需要在run()内使用hzinstance,请同时实施HazelcastInstanceAware

    对于案例2),您只需致电

        executor.executeOnAllMembers(new YourBigTaskClass()); 
    

    将在所有已知集群成员上执行您的任务。

    希望这会有所帮助。我仍然鼓励您研究IExecutorService的其他方法,并以最佳方式使用适合您问题的方法。