#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 в дочерних классах.