我想知道用什么方法来获取任务信息,而不是执行者信息。我可以使执行者编号>任务号,似乎任务号没用。
我在main
中使用了getComponentTasks()
,但我只能获得执行者。
任何人都可以帮助我?
答案 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。
关于邮件中的问题答案(我回复了邮件),如果你不介意,我会把它粘贴在这里作为参考:
在JStorm中,每个任务都有一个Integer类型的taskId。通常,为每个组件分配一系列任务ID(num等于组件并行性)任务实际上有ID吗?
如果是,可以检索这些ID吗?
是的,使用TopologyContext.getThisTaskId()方法
我们能以某种方式至少获得每个运营商的任务数量吗?
是的,使用TopologyContext.getComponentTasks()。size()
应该重命名上面的方法吗?
我们可以在合并阶段开始时讨论这个问题。您可以稍后参考相关的jira。