2016-01-21 40 views
1

運行我的拓撲時,特別是在螺栓中,我得到NullPointerException s中的backtype.storm.utils.DisruptorQueue.consumeBatchToCursor方法。噴嘴正式執行。運行拓撲時在Storm中發生NullPointerException

Storm的故障排除page表示這可能是由於OutputCollector上有多個線程發出方法。但是,我不明白它與我的案件有什麼關係。

下面是壺嘴代碼:

(defspout stub-spout ["stub-spout"] 
    [conf context collector] 
    (spout 
    (nextTuple [] 
     (let [channel-value (<!! storm-async-channel)] 
     (emit-spout! collector [channel-value]))) 
    (ack [id] 
    )))) 

和螺栓:

(defbolt stub-bolt ["stub-bolt"] [tuple collector] 
    (println "Invocation!") 
    (let [obj (get tuple "object") 
     do-some-calculations (resolve 'calclib/do-some-calculations) 
     new-obj (do-some-calculations obj)] 
    (emit-bolt! collector new-obj))) 

經過一番調查事實證明,調用resolve返回null(我在運行時需要resolve因爲一些計算髮生在位於calclib的宏中)。

雖然代碼在本地羣集中正常運行。這是爲什麼發生?

將不勝感激的任何建議。 謝謝!

回答

1

我想我找到了解決方案。螺栓定義更改爲準備螺栓:

(defbolt stub-bolt ["stub-bolt"] 
    {:prepare true} 
    [conf context collector] 
    (let [f (load "/calclib/core") 
     do-some-calculations (resolve 'calclib/do-some-calculations)] 
    (bolt 
     (execute [tuple] 
     (let [obj (get tuple "object") 
       new-obj (do-some-calculations obj)] 
      (emit-bolt! collector new-obj)))))) 

主要是調用load。我想知道是否有更優雅的方法。