【问题标题】:Basic Hazelcast distributed computing concepts基本的 Hazelcast 分布式计算概念
【发布时间】:2014-07-01 23:55:15
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: java multithreading cluster-computing hazelcast


    【解决方案1】:

    我与 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
    

    【讨论】:

      【解决方案2】:

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

      你为什么要这样做?如果你需要访问运行 runnable/callable 的 HazelcastInstance,让它实现 HazelcastInstanceAware 并且你得到 HazelcastInstance 注入。

      -- 在 Runnables/Callables 中创建实例与在主线程中创建实例的效果是什么?

      不明白你的问题。请详细说明。

      -- IExecutorService 是否会选择发送到哪些节点和线程?

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

      因此,您可以将其完全交给 HZ,也可以完全控制。无论您需要什么。

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

      我不明白你的意思。

      【讨论】:

        猜你喜欢
        • 2013-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 2012-02-19
        • 1970-01-01
        相关资源
        最近更新 更多