2015-01-16 11 views
0

我編寫了一個非常簡單的Java應用程序,它執行一些md5哈希計算。 我試圖將這些計算分發給我的實驗室中的幾個節點,以加快速度。 這實際上工作,但它的分佈如何造成我的麻煩。 網格中有8個節點只有一個節點。 我想爲每個節點的每個CPU分配一個作業(線程,可調用,任務)。但是,我得到了一個非常糟糕的分佈:有時4個作業在一個CPU上運行,而具有8個cpu的節點只有2或3個任務。 我發現forPredicate(GridPredicate p)的函數的GridGain API(forPredicate in GridGain API)中:GridGain根據CPU分配任務投影中可用的節點數

創建網格投影其包括通過給定的過濾器謂詞的所有節點。

但是,我使用它錯了,或者我得到它的功能錯誤。這裏是什麼,我得到了一個小例子:

 public class Driver implements GridCallable<Integer>{ 
     [...]      
     Grid g = GridGain.start(gConf);  
     ArrayList<GridFuture<Integer>> workers = new ArrayList<GridFuture<Integer>>(); 
     for(int i=0; i<workercount; i++){ 
      Driver worker = new Driver(); 
      //Here some values get added to the driver object, irrelevant 
      workers.add(g.forPredicate(new GridPredicate<GridNode>() { 
        @Override 
        public boolean apply(GridNode node) { 
         int cores = node.metrics().getTotalCpus(); 
         return ((node.metrics().getCurrentWaitingJobs()+node.metrics().getCurrentActiveJobs()) < cores); 
        } 
      }).compute().call(worker)); 
     } 
     [...] 
     public Integer call(){[...]} 
     } 

預期的行爲是,它會檢查每個節點這得花多少的CPU了,並檢查jobcount(主動和等待)是大於這個數在發送作業之前到它。 但事實並非如此。我仍然得到「不良分佈」。 任何人都可以告訴我如何根據每個節點可用的CPU數量進行分配嗎? 感謝您的幫助和時間!

回答

0

對於相對短時間運行的任務使用度量標準通常效果不佳,因爲度量標準更新頻率太小。

我看到了兩個解決方案可供外的盒子:

  • 配置GridWeightedRandomLoadBalancingSpi與節點重量等於可用處理器數量和執行您對電網任務,而不選擇subprojection,讓GridGain負載平衡的任務。然後節點將獲得與可用處理器數量成正比的負載。
  • 配置GridJobStealingCollisionSpi。在這種情況下,負載較小的節點將從超負荷節點「偷走」作業,同時等待隊列中的作業。當工作計算成本未預先知道時,這種方法特別適用。

參考的SPI javadoc和文檔的詳細信息: http://doc.gridgain.org/latest/Job+Collision+Resolution http://doc.gridgain.org/latest/Load+Balancing

UPD:這裏是你如何配置加權負載均衡SPI使用可用的處理器數量:

<property name="loadBalancingSpi"> 
    <bean class="org.gridgain.grid.spi.loadbalancing.weightedrandom.GridWeightedRandomLoadBalancingSpi"> 
     <property name="useWeights" value="true"/> 
     <property name="nodeWeight" value="#{T(java.lang.Runtime).getRuntime().availableProcessors()}"/> 
    </bean> 
</property>