从Spout发出自定义Java对象作为元组

时间:2015-09-16 13:41:46

标签: java apache-storm

我是Apache Storm的新手。为了理解它,我正在研究Storm教程(https://github.com/apache/storm/tree/master/examples/storm-starter)中提供的Storm示例。

在所有示例中,我们将元组(String,int等)作为元组发出。

在我的用例中,我有一个Java对象,我想将其作为元组发送到螺栓。

我不知道该怎么做。看来我必须实现一个自定义的Tuple生成器来将Java对象转换为Values

任何人都可以为我提供一些示例:

对于我的Java对象是:

class Bean 
{
   int A;
   String B;
   Bean2 b;
   //setters and getters
} 

class Bean2
{
    //Some Attributes
}

现在,在我的nextTuple() Spout方法中,我有一个Bean对象的实例。

class Spout implements IRichSpout
{
    //...
    void nextTuple()
    {
        Bean b = queue.poll();//queue contains instances of Bean Object
        //How to convert this object to tuple and emit it as Tuples???
    }
}

如何翻译成Tuple并发出并通过我的螺栓消耗它。

1 个答案:

答案 0 :(得分:2)

有两种可能性:

  1. 只发出包含Bean

    的单个属性元组
    class Spout implements IRichSpout {
        void nextTuple() {
            Bean b = queue.poll();
            collector.emit(new Values(b));
        }
    }
    

    这是最简单的方法,但有一个缺点,就是你不能使用fieldGrouping(...)中的各个属性来消耗螺栓。此外,您应该在Kryo中注册Bean以进行高效(反)序列化:

    Config c = new Config();
    c.registerSerialization(Bean.class);
    StormSubmitter.submitTopology("name", c, builder.createTopology());
    
  2. 单独发出每个属性:

    class Spout implements IRichSpout {
        void nextTuple() {
            Bean b = queue.poll();
            // of course, you can also un-nest Bean2
            collector.emit(new Values(b.getA(), b.getB(), b.getBean2()));
        }
    }
    

    这允许使用fieldsGrouping(...)中的每个属性(或属性组合)。但是,在使用者处,您需要单独检索每个属性并使用setter方法构建新的Bean对象。

  3. 作为第二种方法的替代方案,请参阅How to use apache storm tuple