簡體   English   中英

基本的Hazelcast分布式計算概念

[英]Basic Hazelcast distributed computing concepts

在“分布式計算”部分中,我已經閱讀了Hazelcast文檔( http://hazelcast.org/docs/latest/manual/html ),但是我對某些基本概念尚不清楚。 我希望使用IExecutorService將多個Runnable或Callable實例發送到本地計算機上的多個線程以及群集中的其他計算節點。 我有幾個問題:

  1. 我是否需要在Runnables / Callables中創建新的Hazelcast實例?
  2. 在Runnables / Callables中創建實例與在主線程中創建實例相比有什么作用?
  3. IExecutorService是否會選擇發送到哪些節點和線程?
  4. 我是否需要擔心我創建的新Hazelcast實例將如何綁定到線程和節點,還是會自動發生?

謝謝!

我與Hazelcast的人們進行了交談,發現我對它的工作原理有一些基本的誤解。 我不了解您必須通​​過在計算節點上運行“ com.hazelcast.examples.StartServer”來像服務或守護程序一樣部署Hazelcast。 這就是節點之間相互了解和交互的方式。 為此,Hazelcast zip包含一些批處理和外殼腳本。 也許這對於其他人來說是顯而易見的,但是我在文檔中沒有發現任何明確說明這一點的內容。 我從文檔中得到的就是將jar放到類路徑中,這使我可以訪問所有類和方法。 我不知道應該如何准備計算節點以相互了解。

我的前兩個問題上面從Hazelcast文檔,其中在分布式計算部分的第一個例子,他們所創造的可贖回一個新的Hazelcast實例來了。 我不確定為什么要這么做,但這對我來說是極具誤導性的。 我認為這意味着我需要創建一個新的Hazelcast實例並將其與每個線程關聯。

上面的Pveentjer回答了問題3。答案是肯定的,如果您願意的話。

問題4只是由於我對Hazelcast的工作方式感到困惑。 基本上,正如我認為的那樣,Hazelcast實例和線程之間沒有一對一的映射。 每個Hazelcast實例已經是多線程的,因此出於並行處理的原因,無需在一個節點上創建多個實例(但是您可能由於其他原因(堆空間限制等)而希望這樣做。必須在所有計算節點(我使用上面提到的StartServer)上部署Hazelcast。

簡而言之,我能夠輕松地創建計算集群

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

-是否需要在Runnables / Callables中創建新的Hazelcast實例?

你為什么要這么做? 如果您需要訪問運行runnable / callable的HazelcastInstance,請使其實現HazelcastInstanceAware,然后將HazelcastInstance注入。

-在Runnables / Callables中創建實例與在主線程中創建實例相比有什么作用?

不明白你的問題。 請詳細說明。

-IExecutorService是否會選擇發送到哪些節點和線程?

取決於您撥打的電話。 有不同的執行方法,例如在該成員上執行,在成員的子集(可能是所有成員)上執行,在成員擁有的分區上執行或在任何成員上執行。

因此,您可以將其完全交給HZ,也可以完全控制。 無論你需要什么。

-我是否需要擔心我創建的新Hazelcast實例將如何綁定到線程和節點,還是會自動發生?

我不懂你的意思

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM