基本的Hazelcast分布式计算概念

时间:2014-07-01 23:55:15

标签: java multithreading cluster-computing hazelcast

我通过“分布式计算”部分阅读了Hazelcast文档(http://hazelcast.org/docs/latest/manual/html),但我对某些基本想法并不清楚。我希望使用IExecutorService将几个Runnable或Callable实例发送到本地计算机上的多个线程和集群中的其他计算节点。我有几个问题:

  1. 我是否需要在Runnables / Callables中创建新的Hazelcast实例?
  2. 在Runnables / Callables中创建实例与在主线程中创建实例有什么影响?
  3. IExecutorService会选择发送哪些节点和线程吗?
  4. 我是否必须担心我创建的新Hazelcast实例将如何绑定到线程和节点,或者这是自动发生的?
  5. 谢谢!

2 个答案:

答案 0 :(得分:2)

我与Hazelcast的人们进行了交谈,发现我对它的运作方式有一些根本的误解。我不明白你必须通过在计算节点上运行“com.hazelcast.examples.StartServer”来像服务或守护进程一样部署Hazelcast。这就是节点如何意识到并相互交互的方式。 Hazelcast zip包含一些用于此目的的批处理和shell脚本。也许这对其他人来说是显而易见的,但我没有在文档中找到明确说明这一点的任何内容。我从文档中得到的就是我将jar放在classpath中,这使我可以访问所有类和方法。我不知道我应该如何准备计算节点以便彼此了解。

上面的前两个问题来自Hazelcast文档,在分布式计算部分的第一个示例中,他们在Callable中创建了一个新的Hazelcast实例 。我不确定他们为什么这样做,但这对我来说极具误导性。我认为这意味着我需要创建新的Hazelcast实例并将其与每个线程相关联。

Pveentjer上面回答问题3.答案基本上就是,如果你想要的话。

问题4是因为我对Hazelcast的工作原理感到困惑。基本上,我认为Hazelcast实例和线程之间没有一对一的映射。每个Hazelcast实例都已经是多线程的,因此不需要为了并行处理的原因在一个节点上创建多个实例(但是你可能因为其他原因(堆空间限制等)而想要这样做。当然,你肯定是必须在所有计算节点上部署Hazelcast(我使用上面提到的StartServer)。

简而言之,我只需

即可轻松创建计算群集

1)将Hazelcast jar放入主节点上的类路径中(或将其包含在我的Eclipse项目中)

2)使用带有StartServer调用的批处理文件在计算节点上部署Hazelcast

3)创建一个Runnable并使其可序列化(及其所有依赖项)

4)在我的Main()方法中创建Hazelcast实例并获取IExecutorService以执行我的Runnable实例

唯一重要的一步是确保在计算节点上部署StartServer时,在类路径中放置Hazelcast jar和包含Runnable定义的所有jar以及它所依赖的所有类。

下面是一个简单的例子:

public class myRunnable implements Runnable, Serializable {

myTestClass mclass;

public myRunnable(){
    mclass = new myTestClass();
}


@Override
public void run(){

    try {
        System.out.println("Putting thread to sleep for 5 seconds");
        Thread.sleep(5000);
    }
    catch(Exception e){
        e.printStackTrace();
    }

    System.out.println("\nTesting MyRunnable on Thread: " + Thread.currentThread().getName());

}

}

然后定义Runnable所依赖的类:

public class myTestClass implements Serializable{

List<Double> list = new ArrayList<Double>(10);

public void myTestClass(){

    for (int i = 0; i < 10; i++)
        list.add( (double) i);
}

}

创建一个Hazelcast实例和IExecutorService来执行

public class TestHazelCast {

public static void main(String[] args) {

    Config cfg = new Config();
    HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
    IExecutorService exec = instance.getExecutorService("exec");

    for (int i = 0 ; i < 7; i++){
        exec.execute(new myRunnable());
    }

}

}

然后使用以下内容在计算节点上部署Hazelcast以及适当的jar:

java -server -Xms1G -Xmx1G -cp "../lib/hazelcast-3.2.2.jar;../lib/AllMyClasses.jar" com.hazelcast.examples.StartServer

答案 1 :(得分:0)

- 我是否需要在Runnables / Callables中创建新的Hazelcast实例?

你为什么要这样做?如果你需要访问运行runnable / callable的HazelcastInstance,让它实现HazelcastInstanceAware,你就会受到HazelcastInstance的攻击。<​​/ p>

- 在Runnables / Callables中创建实例与在主线程中创建实例有什么影响?

不要理解你的问题。请详细说明。

- IExecutorService会选择发送哪些节点和线程吗?

取决于你的电话。有不同的执行方法,如执行该成员,执行子集(可能是所有)成员,执行成员拥有分区或执行任何成员。

所以你可以把它完全留给HZ,或者你可以完全控制。无论你需要什么。

- 我是否必须担心我创建的新Hazelcast实例将如何绑定到线程和节点,或者这是自动发生的?

我不知道你的意思。