0

我希望有人以前做过,或者如果有人可以建议 Gridgain 是否支持此功能。

我的用例是:

  1. 使用修改后的示例/config/example-compute.xml 启动 Gridgain 节点以支持工作窃取(见下文)
  2. 向集群提交 300 个任务。它们开始在第一个节点上执行,但是由于执行需要时间,因此有很长的未完成任务队列
  3. 使用相同的配置启动一个新节点并观察它加入集群
  4. 节点 2 不应该从第一个节点窃取一些工作吗?不幸的是,它没有,我们必须等待节点 1 上的所有任务完成,而节点 2 什么都不做

我认为这GridJobStealingCollisionSpi是在做某事,因为当我打开调试日志记录时,我可以在日志中看到以下消息Thief node does not belong to task topology [...]:并查看源代码,我认为正在发生的GridJobStealingCollisionSpi是检查窃取节点是否在提交任务的拓扑中。

有没有人看到我的用例按我的预期工作?

我已经修改了 example-compute.xml(您可以在 pastebin.com/gGsfEebG 找到整个文件)以通过添加以下配置来支持工作窃取:

<property name="collisionSpi">
    <bean class="org.gridgain.grid.spi.collision.jobstealing.GridJobStealingCollisionSpi">
        <property name="activeJobsThreshold" value="50" />
        <property name="waitJobsThreshold" value="10" />
        <property name="messageExpireTime" value="1000" />
        <property name="maximumStealingAttempts" value="100" />
        <property name="stealingEnabled" value="true" />
    </bean>
</property>
<property name="failoverSpi">
    <bean class="org.gridgain.grid.spi.failover.jobstealing.GridJobStealingFailoverSpi">
        <property name="maximumFailoverAttempts" value="5" />
    </bean>
</property>
<property name="metricsUpdateFrequency" value="1000"/>

我的 java 类可以在这里的 pastebin 找到:http: //pastebin.com/AS8iKqjj,这里是运行它的详细说明:

  1. 运行 ComputeSleepExample 类,该类启动一个节点并向集群提交 300 个将休眠 5 秒的作业

    java -DGRIDGAIN_DEBUG_ENABLED=true -DGRIDGAIN_QUIET=false -cp examples/config:examples/target/classes:examples/target/libs/*:target/gridgain-‌​6.1.9.jar:modules/spring/target/gridgain-spring-6.1.9.jar org.gridgain.examples.compute.ComputeSleepExample 300 5000

  2. 启动一个新节点,你会看到所有作业都在节点1上执行

    bin/ggstart.sh examples/config/example-compute.xml

4

1 回答 1

0

问题是当前任务在映射步骤期间定义了它的节点拓扑。如果您在任务已经完成其映射步骤之后添加新节点,则新节点将不在任务拓扑中。这就是它不参与抢工作的原因。

如果在新节点启动后开始添加更多任务,那么它应该立即开始参与作业窃取。

话虽如此,可以使任务拓扑动态化,因此即使在映射步骤之后,工作窃取也可以窃取工作。GridGain 将在未来的版本中实现它。

于 2014-08-15T14:55:49.087 回答