【问题标题】:NullPointerException in Storm when running topology运行拓扑时 Storm 中的 NullPointerException
【发布时间】:2016-01-21 19:11:24
【问题描述】:

在运行我的拓扑时,我在backtype.storm.utils.DisruptorQueue.consumeBatchToCursor 方法中得到NullPointerExceptions,特别是在螺栓中。 Spout 被适当地执行。

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 的宏中)。

代码在本地集群中运行正常。为什么会这样?

将不胜感激任何建议。 谢谢!

【问题讨论】:

    标签: clojure nullpointerexception apache-storm core.async


    【解决方案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 的调用。我想知道是否有更优雅的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多