java - Hazelcast 分布式计算的基本概念

标签 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 实例将如何绑定(bind)到线程和节点,还是会自动发生?

谢谢!

最佳答案

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

我上面的前两个问题来自 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

关于java - Hazelcast 分布式计算的基本概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24520921/

相关文章:

java - Spring MVC Controller 中的 JSON 参数

java - Android:将动画插入对话框

java - Spring Security手动登录最佳实践

java - JProgressBar 无法从 ActionEvent 正确显示

python - 当函数处于事件状态时终止脚本

java - 使用 Hazelcast 存储全局常量会被视为滥用吗?

Java SE "occurred during initialization of VM"

c# - BacgroundWorkerCompleted 不执行

ubuntu - Hive Hadoop 集群 - Hive 客户端不一致的数据库 View

jakarta-ee - 集群 Java EE Web 应用程序 - 选项?