如何在风暴中获取任务编号和id而不是执行者?

时间:2015-12-16 10:12:59

标签: apache-storm

我想知道用什么方法来获取任务信息,而不是执行者信息。我可以使执行者编号>任务号,似乎任务号没用。

我在main中使用了getComponentTasks(),但我只能获得执行者。

任何人都可以帮助我?

3 个答案:

答案 0 :(得分:2)

任务ID是单个整数。执行程序ID是一系列任务ID。 1,2,3是任务ID。如果有一个执行器正在运行所有这三个任务,那么它的ID将是[1,3]这是一个clojure持久向量,其中低任务ID作为第一个元素,高任务ID作为第二个元素。

Matthias J. Sax是正确的context.getComponentTasks(compId)将返回该特定组件的完整任务ID集。

除非你做一些特殊的事情,否则执行者的数量很可能与任务数量相匹配。在这种情况下,执行者ID看起来像[1,1],[2,2]和[3,3]。您可以使用Nimbus Thrift客户端的rebalance命令或重新平衡方法调整​​每个组件的执行程序数。

我无法通过TopologyContext获取组件的执行程序数。如果需要,我们可以添加一个,只需在http://issues.apache.org/jira中的STORM组件下提交JIRA即可通过从nimbus获取TopologySummary来获取该信息,但这相当难看,特别是因为所有信息都是已经在你正在运行的过程中,它不会暴露给你。

如果您认为getComponentTasks返回的内容不正确,请将JIRA提交为可重复使用案例的错误,以便我们为您调试/修复它。

答案 1 :(得分:0)

您可以使用

List<Integer> taskIds = context.getComponentTasks(context.getThisComponentId());

接收当前组件的所有任务ID。如果要在整个拓扑中获取所有任务ID,则需要按组件收集它们并将它们全部放在一起:

List<Integer> taskIds = new LinkedList<Integer>();
for(String compId : context.getComponentIds()) {
    taskIds.addAll(context.getComponentTasks(compId));
}

答案 2 :(得分:0)

根据apache-dev-list的帖子,你使用的是JStorm而不是Storm,对吗?

在JStorm中,没有执行器,因此TopologyContext.getComponentTasks()返回此组件中的任务ID。

关于邮件中的问题答案(我回复了邮件),如果你不介意,我会把它粘贴在这里作为参考:

  

任务实际上有ID吗?

在JStorm中,每个任务都有一个Integer类型的taskId。通常,为每个组件分配一系列任务ID(num等于组件并行性)

  

如果是,可以检索这些ID吗?

是的,使用TopologyContext.getThisTaskId()方法

  

我们能以某种方式至少获得每个运营商的任务数量吗?

是的,使用TopologyContext.getComponentTasks()。size()

  

应该重命名上面的方法吗?

我们可以在合并阶段开始时讨论这个问题。您可以稍后参考相关的jira。