Apache storm 如何获取任务编号和id而不是storm中的执行者?

Apache storm 如何获取任务编号和id而不是storm中的执行者?,apache-storm,Apache Storm,我想知道用什么方法来获取任务信息,而不是执行者信息。我可以让执行者编号>任务编号,似乎任务编号是无用的 我在Topologycontext中使用了getComponentTasks(),但我只能获取执行器 有人能帮我吗?你可以用 List taskIds=context.getComponentTasks(context.getThisComponentId()); 接收当前组件的所有任务ID。如果要获取整个拓扑中的所有任务ID,需要按组件收集它们并将它们放在一起: List taskIds=

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

我在
Topologycontext
中使用了
getComponentTasks()
,但我只能获取执行器

有人能帮我吗?

你可以用

List taskIds=context.getComponentTasks(context.getThisComponentId());
接收当前组件的所有任务ID。如果要获取整个拓扑中的所有任务ID,需要按组件收集它们并将它们放在一起:

List taskIds=newlinkedlist();
对于(字符串compId:context.getComponentDS()){
addAll(context.getComponentTasks(compId));
}

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

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

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

据我所知,无法通过TopologyContext获取组件的执行器数量。如果您需要,我们可以在中添加一个,只需在中的STORM组件下提交一个JIRA,您当前可以通过从nimbus获取拓扑摘要来获取该信息,但这相当难看,特别是因为所有信息都已经在您运行的过程中,因此不会向您公开


如果您认为getComponentTasks返回的内容不正确,请将JIRA作为一个bug提交到一个可复制的用例中,以便我们可以为您调试/修复它。

根据apache开发列表中的帖子,您使用的是JStorm而不是Storm,对吗

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

至于邮件中问题的答案(我已回复邮件),如果您不介意的话,我将其粘贴在这里作为您的参考:

任务实际上有ID吗

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

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

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

我们是否能以某种方式至少获得每个操作员的任务数

是,请使用TopologyContext.getComponentTasks().size()

是否应该重命名上述方法


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

您希望得到什么样的任务信息?我希望得到所有任务的id。.使用getComponentTasks()返回一个执行者id列表。但我希望得到组件的真实任务id。.您确定它返回的是执行者id而不是任务id吗?您有不同于任务的执行者数量吗?是的,我将并行度设置为5,setTaskNumber(10)…它只返回5个taskid。我知道这一点,它似乎返回了执行者id。例如,我将组件的并行度设置为5,它返回5个taskid。但是setTaskNumber(10)。context.getComponentCommon().get_parallelism_hint()返回执行者编号。执行者会死,但任务永远不会改变?我不确定你现在是否能得到任务的数量。方法名绝对不是一个好的选择。我将在Storm dev邮件列表中开始讨论。您订阅了吗?这样您就可以关注讨论了吗?现在,我唯一的想法就是收集任务信息(即,每个操作员的任务数),以便在将拓扑插入到一起时(即,调用
setnumtask(…)
并通过您可以通过
StormSubmitter.submitTopology(…)
提供的
配置
对象将其交给拓扑。我还没有订阅它。为什么要使用task的方法名称,但返回executor.和setNumtasks()似乎没有必要…抱歉,我发现我使用了jstorm。storm没有问题。但是当我使用jstorm时,这个问题出现在jstorm中,方法setTasksNumber似乎没有用!taskid对应于ThreadId jstorm,任务编号在TopologyBuilder中设置如下:
builder.setBolt('Your_Bolt_Name',new YourBolt(),Bolt_parallelism_hint)
我们没有SetTasksMember方法……我也不知道taskid对应于threadid。你确定你在引用JStorm吗?在JStorm中,一个任务对应一个执行者。JStorm中的任务是静态的吗?当我们进行重新平衡时,任务编号不会更改?重新平衡后,任务编号也可能会更改相应的任务id,因为重新平衡通常会更改组件的并行性。