如何在Storm中停止元组处理并执行其他代码

时间:2016-08-23 10:28:57

标签: java sql apache-storm thread-sleep

我是Storm的新手。我正在将它用于大学项目。

我创建了拓扑,Spout链接到MySql数据库,还有两个螺栓。连接到喷口的第一个螺栓准备并移除元组不必要的信息;第二,对元组进行过滤。

我在本地模式工作。

我的问题是: 为什么在运行拓扑之后,在我的控制台中我看到输出如下面的行?

38211 [Thread-14-movie-SPOUT] INFO  backtype.storm.daemon.executor - Processing received message source: __system:-1, stream: __tick, id: {}, [30]
67846 [Thread-10-__acker] INFO  backtype.storm.daemon.executor - Processing received message source: __system:-1, stream: __metrics_tick, id: {}, [60]
67846 [Thread-8-cleaning-genre-bolt] INFO  backtype.storm.daemon.executor - Processing received message source: __system:-1, stream: __metrics_tick, id: {}, [60]
67852 [Thread-10-__acker] INFO  backtype.storm.daemon.task - Emitting: __acker __metrics [#<TaskInfo backtype.storm.metric.api.IMetricsConsumer$TaskInfo@3c270095> [#<DataPoint [__emit-count = {}]> #<DataPoint [__process-latency = {}]> #<DataPoint [__receive = {read_pos=0, write_pos=1, capacity=1024, population=1}]> #<DataPoint [__ack-count = {}]> #<DataPoint [__transfer-count = {}]> #<DataPoint [__execute-latency = {}]> #<DataPoint [__fail-count = {}]> #<DataPoint [__sendqueue = {read_pos=-1, write_pos=-1, capacity=1024, population=0}]> #<DataPoint [__execute-count = {}]>]]
67853 [Thread-8-cleaning-genre-bolt] INFO  backtype.storm.daemon.task - Emitting: cleaning-genre-bolt __metrics [#<TaskInfo backtype.storm.metric.api.IMetricsConsumer$TaskInfo@38c3d111> [#<DataPoint [__emit-count = {default=1680}]> #<DataPoint [__process-latency = {}]> #<DataPoint [__receive = {read_pos=1621, write_pos=1622, capacity=1024, population=1}]> #<DataPoint [__ack-count = {}]> #<DataPoint [__transfer-count = {default=1680}]> #<DataPoint [__execute-latency = {movie-SPOUT:default=0.15476190476190477}]> #<DataPoint [__fail-count = {}]> #<DataPoint [__sendqueue = {read_pos=1680, write_pos=1680, capacity=1024, population=0}]> #<DataPoint [__execute-count = {movie-SPOUT:default=1680}]>]]
67854 [Thread-13-filtering-genre-BOLT] INFO  backtype.storm.daemon.executor - Processing received message source: __system:-1, stream: __metrics_tick, id: {}, [60]
67855 [Thread-13-filtering-genre-BOLT] INFO  backtype.storm.daemon.task - Emitting: filtering-genre-BOLT __metrics [#<TaskInfo backtype.storm.metric.api.IMetricsConsumer$TaskInfo@6d5c75a9> [#<DataPoint [__emit-count = {}]> #<DataPoint [__process-latency = {}]> #<DataPoint [__receive = {read_pos=1681, write_pos=1682, capacity=1024, population=1}]> #<DataPoint [__ack-count = {}]> #<DataPoint [__transfer-count = {}]> #<DataPoint [__execute-latency = {cleaning-genre-bolt:default=0.08333333333333333}]> #<DataPoint [__fail-count = {}]> #<DataPoint [__sendqueue = {read_pos=-1, write_pos=-1, capacity=1024, population=0}]> #<DataPoint [__execute-count = {cleaning-genre-bolt:default=1680}]>]]

我读到最后一个元组处理后的这些行被认为是正常的。不是吗?

如何在提交拓扑后运行其他代码?例如,我想在第二个螺栓中打印我的过滤结果,保存在HashMap中。 如果我将代码放在包含submitTopology()方法的行之后,代码将在元组完成之前运行。

第二个也是最后一个问题是:为什么在Storm的每一个例子中,我都会在Spout中看到

  

“的Thread.sleep(1000)”?

也许这与我的第一个问题有关。

我希望我的问题很明确。 提前谢谢!

1 个答案:

答案 0 :(得分:1)

  

我读到最后一个元组处理后的这些行被认为是正常的。不是吗?

这些只是INFO条消息。所以不用担心它们。

  

如果我将代码放在包含submitTopology()方法的行之后,代码将在元组完成之前运行。

如果提交拓扑,拓扑将在后台执行(即多线程)。这是必需的,因为您的拓扑运行&#34;永远&#34; (直到你明确地停止它 - 或者你的Java应用程序终止,因为你正在运行本地模式)。

拓扑完成后运行代码&#34;&#34;不符合Storm的概念,因为Strom是一个流媒体系统,并且处理过程中没有任何结束&#34; (输入流无限,因此处理永远运行)。如果要处理有限数据集,可能需要考虑批处理框架,如Flink或Spark。

因此,如果您想在Storm中使这项工作,您需要能够确定何时处理所有数据。因此,在拓扑提交之后,您将在处理完所有数据后明确阻止并等待。

但是,对于您的用例,为什么不只是在最后一个螺栓内打印结果?

关于Thread.sleep()我不确定你提到的例子。不知道为什么有人应该把它投入生产。也许它是为了演示目的而人为地减慢处理速度。