Как apache storm создает свои реализации bolt

#java #hadoop #apache-storm

#java #hadoop #apache-storm

Вопрос:

После реализации очень простой топологии apache storm на java я столкнулся с NPE, который вызвал некоторую путаницу.

По сути, это мой основной метод:

 TologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new CustomSpout(true), 4);
final CustomBolt bolt = new CustomBolt();
builder.setBolt("bolt", bolt, 1).shuffleGrouping("spout");

LocalCluster cluster = new LocalCluster();
Map conf = new HashMap();
conf.put(Config.TOPOLOGY_WORKERS, 10);
cluster.submitTopology("test", conf, createTopology());
  

CustomBolt Расширяет AbstractBasic класс и реализует IRichBolt . У них есть эти поля:

 abstract class AbstractBasic {
    A a;
    B b;
} 

CustomBolt extends AbstractBasic implements IRichBolt {
    A anotherA;
    C c;
    CustomBolt() {
        this.anotherA = new A(true);
        this.a = new A(false);
        this.b = new B();
        this.c = new C();
    }
}
  

В execute методе CustomBolt будут некоторые вставки во все классы. Однако не создаются экземпляры полей, которые унаследованы от AbstractBasic , а другие, те, которые находятся непосредственно в CustomBolt , создаются…

Кто-нибудь знает, как создается bolt и как возможно, что некоторые поля инициализированы, а некоторые нет.

Ответ №1:

Когда болты передаются в топологию, они сериализуются и отправляются каждому рабочему, где они десериализуются. Поскольку AbstractBasic не реализует Serializable , его поля не будут сериализованы при CustomBolt сериализации.

В приведенном вами примере вы должны быть в состоянии решить свою проблему, объявив, что AbstractBasic реализует Serializable :

 abstract class AbstractBasic implements Serializable ...
  

Ответ №2:

Я не уверен, как работает создание экземпляра с Bolts, но я могу найти вескую причину . Насколько я понимаю, мы запускаем топологию в распределенной среде и, чтобы избежать одновременных изменений общих переменных (т. Е. переменных уровня класса, унаследованных от родительских классов), родительским переменным могло быть присвоено значение null в дочерних классах.