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