【问题标题】:Parallel SSH with executorService带有 executorService 的并行 SSH
【发布时间】:2016-08-22 13:51:30
【问题描述】:

我有一个用例,我必须使用 executorService 并行 ssh 到 3 个不同的主机。 我有 M 个主机和每个主机的 N 个作业,我希望能够并行登录到 M 个主机并顺序执行 N 个作业(对于每个主机)。 我尝试了 SSHJ,但似乎它不支持并行 SSH。

最近我一直在尝试使用 Parallec,似乎它收集了所有任务并根据配置中的并发值并行执行。

任何可行的方法/库?

【问题讨论】:

标签: java multithreading jakarta-ee ssh executorservice


【解决方案1】:

这似乎是管理主机集群时常见的典型工作流程/编排问题。

使用 Parallec,您可以在 onCompleted() 处理程序期间将响应/任务状态保存到哈希映射并继续轮询哈希映射。每当您收集完成当前阶段的至少 N 个作业时,您可以触发另一个并行任务,让它们在下一轮运行。

假设您有 1000 台主机 H1...H1000 依次运行 5 个 shell 脚本 S1...S5 作为 5 个阶段。

您可以创建一个并发哈希映射来存储每个主机的运行状态。每个脚本/阶段都会有一个 [ NOT_RUN |运行 | COMPLETED_SUCCESS (COMPLETED_ERROR)] 状态。您还可以为每个主机存储当前哪个并行任务负责运行它。

您启动所有 1,000 台主机以运行脚本 1 作为第一个并行任务。在执行之前,您将散列映射中的每个元素设置为 状态。需要执行任务asynchronously所以它不会阻塞当前线程。在响应处理程序onCompleted() 中,您解析结果并将映射中的相应条目更新为 COMPLETED_X 状态。

您可以按时间间隔不断轮询此地图,每当您发现在已完成阶段中至少有 K 个任务(或最后一组任务)时,您就会触发另一个与完成当前任务的 K 个主机的并行任务阶段进入下一阶段。

请注意,在并行任务中,每个主机可能在不同阶段运行。有些使用脚本 1,有些使用脚本 4;不同主机的不同请求支持此功能:http://www.parallec.io/docs/submit-task/#apis-on-variable-replacement-for-heterogeneous-requests

总而言之,基本思想是小批量运行,以检查哪些主机可用于移动到下一阶段。由于管理器线程只为下一轮挑选已经完成当前阶段的主机,我认为不需要锁定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多