2016-03-08 59 views
3

我是新來的風暴編程,我有一份工作要做一個自定義分組方法的測試,看看它是否更好。如何設置風暴工人的JVM最大堆大小?

所以我有風暴的吞吐量來衡量的不同情況,如不同的工人數目,不同的工人memory..etc

它容易使用conf.setNumWorkers();設置職工人數,但我覺得很難設置每工人的最大堆大小。

我試圖編輯storm.yaml並添加

worker.childopts: "-Xmn128m-Xms128m-Xmx128m" 

conf.put(Config.WORKER_CHILDOPTS, "-Xmn128m -Xms128m -Xmx128m"); 

添加到我的代碼。

但是,當我在我的工作節點上使用jmap -heap [pid]時,我發現最大堆大小仍然是768m,這是默認的最大堆大小。

我該如何達到這個目的來限制JVM的最大內存使用量?

順便說一句,我使用kafkaspout發送消息暴風雨,歡迎任何關於我的測試工作的建議。

+0

你有沒有發現如何做到這一點? – user5520049

+1

@ user5520049不,我沒有找到正確的方法,但是我使用另一種方法通過實現我們自己的噴嘴來限制內存,然後在工人螺栓中達到我們設置的極限時,使元組失敗。如果您有興趣,我可以發佈詳細信息。 –

+0

可以請你發貼嗎?在此先感謝 – user5520049

回答

2

嘗試編輯storm/default.yaml文件。查找工作人員設置,並在那裏找到設置堆內存的條目。它應該看起來像這個默認!

worker.heap.memory.mb: 768 

在同一個文件中,您還可以找到以下設置,您可以根據需要更改這些值。

topology.component.resources.onheap.memory.mb: 128.0 
topology.component.resources.offheap.memory.mb: 0.0 
topology.component.cpu.pcore.percent: 10.0 
topology.worker.max.heap.size.mb: 768.0 

希望有幫助!

+0

我做了你說的,然而'jmap -heap'仍然給我768mb最大堆大小:(你在說什麼風暴版本? –

0

我沒有弄清楚設置JVM的最大堆大小的正確方法,但我使用另一種方法作爲解決方法。

注意:我目前沒有源代碼,所以下面的代碼只是爲了演示這個想法,完全沒有經過測試。

該方法利用了Storm中重傳失敗元組的機制。

如果您正在使用諸如KafkaSpout或其他任何類型的存在噴口,那麼您不必擔心重傳失敗的元組,這一切都由默認實現來完成。

但是,如果你正在實施你自己的噴口,你必須自己做。我相信如果你正在嘗試實現噴口,你必須知道void ack(Object msgId)void fail(Object msgId)等,並且很容易實現重新傳輸機制。

我們的WorkerBolt看起來像這樣,假設它是一個字數螺栓。

class WorkerBolt implements IRichBolt{ 
    ... 
    private HashMap<String, int> counts = new HashMap<>(); 
    private int wordStoredCount = 0; 
    private final int COUNT_LIMIT = 500000; // Here's our limit 
    ... 
    void execute(Tuple tuple){ 
     if(wordStoreCount >= COUNT_LIMIT){ 
      tuple.fail(); 
     } 

     // do our counting stuff 

     wordStoredCount++; 

     // send the tuple downstream to aggregate/process/etc. if needed 
    } 
    ... 

這不是很準確,因爲每一個字可以有不同的長度或大小,您可以使用MEMORY_COUNTmemoryStoredCount和每個字的內存使用量加起來memoryStoredCount更準確。

採用此方法使系統更具可控性,因爲如果我們設置最大堆大小並且JVM達到界限,它將僅引發OutOfMemoryException並關閉系統,這可能不是我們首先想要的。

+0

感謝您的回答,我的問題是閱讀worker.childopts的大小,因爲它是重新與另一個號碼,我的基本問題是OOM「GC的開銷限制超過」我試圖增加工人的大小和增加沒有重新寫,因爲我寫。 – user5520049

1

您可以通過以下步驟來更改員工的最大堆大小:

1:添加「worker.heap.memory.mb:2048」到靈氣節點的conf/storm.yaml文件;

2:重啓靈氣和主管

工人堆的大小將變爲2GB

+0

這似乎不適用風暴0.10.0 - 仍然使用默認的768m,這是在重新啓動nimbus,workers和topology並將worker.heap.memory.mb:2048分發給所有風暴節點之後,這個帖子到風暴用戶列表表明了類似的行爲(對於某些版本至少)https://mail-archives.apache.org/mod_mbox/storm-user/201503.mbox/%[email protected]。gmail.com%3E –

+0

我剛剛檢查了源代碼,事實上該optioin只能在Storm> 1.0.0中使用,之前worker.childopts必須被明確設置 –

2

如果你的暴風版本是1.0.0 <你必須設置在storm.yaml worker.childopts,和重新啓動你的主管。該參數不會作爲特定於拓撲的選項from what I've gleaned被引入,因此拓撲配置會發生變化,不會影響結果。

對於Storm版本> = 1.0.0,您可以參考ssadaqat's answer,但不需要編輯defaults.yaml(這是源代碼的一部分),您需要再次將此值插入到storm.yaml中。

1

雖然ssadaquat的答案是正確的,並且可以設置在風暴YAML文件中的工人的記憶,我已經能夠成功地做到這一點編程方式是這樣的:

Config stormConfig = new Config(); 
int fourGB = 4 * 1024; 
stormConfig.put(Config.TOPOLOGY_WORKER_MAX_HEAP_SIZE_MB, fourGB); 

這樣做,這樣是如果你特別有幫助不想因爲在多臺服務器上更改yaml文件而煩惱,或者如果您不想爲修改yaml文件而煩惱。

有很多答案說你必須設置childopts來增加內存,但這對我來說不起作用。事實上,我注意到在設置topology_worker_max_heap_size_mb之後,childopts的值自動增加。還要儘量確保在服務器上有enough of swap memory,特別是在處理大量數據時。

相關問題