我正在运行风暴三叉戟拓扑,在两个不同的流中有两个不同的喷口。我的鲸鱼嘴是JMS鲸鱼喷水,并使用HDFS状态来保持元组。
如果我只运行一个spout,它正常工作,我将所有记录发布到HDFS中的JMS队列。
在运行两个spout连接到两个不同队列的拓扑时,与我在QUEUE中发布的记录相比,记录的记录更少。我在这里做错了吗?如果我这样做有任何问题,请告诉我。
TridentTopology topology = new TridentTopology();
topology.newStream("QueueSpout", TridentSpout).partitionPersist(tradeStateFactory,hdfsFields, new HdfsUpdater());
Stream TopicStream = topology.newStream("TopicSpout", TridentTopicSpout);
TopicStream.each(hdfsFields, new CashFilter()).partitionPersist(cashStateFactory, hdfsFields, new HdfsUpdater());
TopicStream.each(hdfsFields, new JournalFilter()).partitionPersist(journalStateFactory, hdfsFields, new HdfsUpdater());
TopicStream.each(hdfsFields, new RcvdlvrFilter()).partitionPersist(rcvdlvrStateFactory, hdfsFields, new HdfsUpdater());
答案 0 :(得分:0)
以下配置可以正常使用拓扑。
这是因为我没有使用分区分组。
使用Global和批量全局后,它正常工作。
shuffle :使用随机循环算法在所有目标分区中均匀重新分配元组
广播:每个元组都会复制到所有目标分区。这在DRPC期间很有用 - 例如,如果您需要在每个数据分区上执行stateQuery。
partitionBy :partitionBy接受一组字段,并根据该组字段进行语义分区。对字段进行散列并通过目标分区的数量进行修改以选择目标分区。 partitionBy保证同一组字段始终转到同一目标分区。
全局:所有元组都发送到同一个分区。为流中的所有批次选择相同的分区。
batchGlobal :批处理中的所有元组都会发送到同一分区。流中的不同批次可能会转到不同的分区。
分区:此方法接受一个自定义分区函数,该函数实现backtype.storm.grouping.CustomStreamGrouping
以下拓扑配置可以正常工作。
TridentTopology topology = new TridentTopology();
topology.newStream("QueueSpout", TridentSpout).batchGlobal().partitionPersist(tradeStateFactory,hdfsFields, new HdfsUpdater());
Stream TopicStream = topology.newStream("TopicSpout", TridentTopicSpout).global();
TopicStream.each(hdfsFields, new CashFilter()).partitionPersist(cashStateFactory, hdfsFields, new HdfsUpdater());
TopicStream.each(hdfsFields, new JournalFilter()).partitionPersist(journalStateFactory, hdfsFields, new HdfsUpdater());
TopicStream.each(hdfsFields, new RcvdlvrFilter()).partitionPersist(rcvdlvrStateFactory, hdfsFields, new HdfsUpdater());