为什么我的螺栓忘记了它的名字?
Why is my bolt forgetting its name?
我制作了一个简单的日志螺栓,但它似乎忘记了其构造函数中提供的名称。此外,似乎构造函数以某种方式被绕过,因为当我向其添加一些日志记录代码时,它不会记录任何内容。
Apache Storm 是否在某些时候对 bolt 做了一些奇怪的事情?
public class SimpleLoggingBolt extends BaseBasicBolt {
private static final Logger LOG = LogManager.getRootLogger();
private static String loggingBoltName;
public SimpleLoggingBolt(String name) {
super();
LOG.info("This does not log anything")
loggingBoltName = name;
}
@Override
public void execute(Tuple input, BasicOutputCollector collector) {
LOG.info("Bolt {} received tuple: {}", loggingBoltName, input);
// Loga "Bolt null received tuple..."
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {}
执行 bolt 构造函数的 JVM 与 运行 执行 execute
方法的 JVM 不同。
当您使用 storm jar
提交拓扑时,Nimbus 会启动一个新的 JVM,它 运行 是您的拓扑连接代码(使用 TopologyBuilder 并调用 StormSubmitter 的部分)。这包括 运行ning 螺栓的构造函数。我相信这个 JVM 只是登录到您用于 运行 storm jar
的终端,这就是您看不到日志的原因。
一旦您的拓扑被提交和验证,它就会被序列化并通过网络发送到主机 运行 宁您的主管(您 运行 storm supervisor
所在的机器)。假设主管被分配给 运行 您的一个螺栓实例。它将启动一个单独的 "worker" JVM,它将 运行 你的螺栓(可能还有一些其他组件)。工作 JVM 是实际工作发生的地方,也是 execute
得到 运行.
的地方
所以你的情况是你的静态 loggingBoltName
在 storm jar
JVM 中初始化,bolt 被序列化,当它在 worker JVM 中被反序列化时,静态字段为 null再次是因为静态字段未序列化。
如果要保留字段值,则不应将字段声明为静态。如果该字段可以序列化,并且不是 static
或 transient
,一旦 bolt 在 worker 中反序列化,它将保留您在构造函数中设置的值。
我制作了一个简单的日志螺栓,但它似乎忘记了其构造函数中提供的名称。此外,似乎构造函数以某种方式被绕过,因为当我向其添加一些日志记录代码时,它不会记录任何内容。
Apache Storm 是否在某些时候对 bolt 做了一些奇怪的事情?
public class SimpleLoggingBolt extends BaseBasicBolt {
private static final Logger LOG = LogManager.getRootLogger();
private static String loggingBoltName;
public SimpleLoggingBolt(String name) {
super();
LOG.info("This does not log anything")
loggingBoltName = name;
}
@Override
public void execute(Tuple input, BasicOutputCollector collector) {
LOG.info("Bolt {} received tuple: {}", loggingBoltName, input);
// Loga "Bolt null received tuple..."
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {}
执行 bolt 构造函数的 JVM 与 运行 执行 execute
方法的 JVM 不同。
当您使用 storm jar
提交拓扑时,Nimbus 会启动一个新的 JVM,它 运行 是您的拓扑连接代码(使用 TopologyBuilder 并调用 StormSubmitter 的部分)。这包括 运行ning 螺栓的构造函数。我相信这个 JVM 只是登录到您用于 运行 storm jar
的终端,这就是您看不到日志的原因。
一旦您的拓扑被提交和验证,它就会被序列化并通过网络发送到主机 运行 宁您的主管(您 运行 storm supervisor
所在的机器)。假设主管被分配给 运行 您的一个螺栓实例。它将启动一个单独的 "worker" JVM,它将 运行 你的螺栓(可能还有一些其他组件)。工作 JVM 是实际工作发生的地方,也是 execute
得到 运行.
所以你的情况是你的静态 loggingBoltName
在 storm jar
JVM 中初始化,bolt 被序列化,当它在 worker JVM 中被反序列化时,静态字段为 null再次是因为静态字段未序列化。
如果要保留字段值,则不应将字段声明为静态。如果该字段可以序列化,并且不是 static
或 transient
,一旦 bolt 在 worker 中反序列化,它将保留您在构造函数中设置的值。