我通过“分布式计算”部分阅读了Hazelcast文档(http://hazelcast.org/docs/latest/manual/html),但我对某些基本想法并不清楚。我希望使用IExecutorService将几个Runnable或Callable实例发送到本地计算机上的多个线程和集群中的其他计算节点。我有几个问题:
谢谢!
答案 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实例将如何绑定到线程和节点,或者这是自动发生的?
我不知道你的意思。