如前文提到的,在等待子任务运行结果的时候,父任务在大多数情况下都是处于等待状态的。在此种状态下,系统分配给父任务的计算资源会暂时处于空闲状态,这将导致系统资源不能得到充分利用。针对此种情况,Symphony 提供 API 来允许父任务暂时借出自己的资源给其子任务使用,这样子任务可以利用其父任务借出的资源进行计算,避免了资源的浪费。
父任务借出的资源只能被子任务借入,子任务除了向父任务借资源外,还可以直接通过 Symphony 获得资源来进行运算。这就保证了在资源匮乏的情况下,子任务可以获得利用父任务的资源进行运算;在资源充足的情况下,子任务可以充分利用系统中的空闲资源进行运算。
在有多层父子关系的情况下,子任务可以把从父任务借到的资源转借给其子任务使用,来达到充分利用资源的目的。
父子任务间的资源共享如图 5 所示:
父任务在借出自己的资源后,可以通过 Symphony 提供的回调函数监测子任务运行的情况,当其需要计算资源处理一些子任务的运行结果时,它可以通过 Symphony 提供的 API 将借出的资源收回,然后进行对应的计算。父任务的资源可以被多次借出和收回。
父任务借出资源的对应代码如下:
- task
- -
- >
- yield
- ()
父任务收回资源对应的代码如下:
- task
- -
- >
- yieldComplete
- ()
通过简单的 API,父任务就可以借出和收回自己的资源。
通过父子任务之间的资源借用,系统资源的利用率得到了提高,任务得以在更短的时间内完成。
在某 Symphony 用户的实际生产环境中(大于 5000 个 CPU 的计算机集群),使用此优化方法后,任务的完成速度提高 30%。
对于父子任务工作模式,Symphony 提供命令行与网页界面来向用户显示父子任务关系和资源的借用情况。
例如,当属于 Session 101 的任务 1 创建了子 Session 102,然后借出其资源后,通过 Symphony 的命令"soamview task"查看其状态,可以看到其状态为"yielded",说明其资源已借出。还可以看到其子 Session 是 Session 102,并且 Session 102 的任务运行在其借出的资源上。命令行的输出如下所示:
- soamview task
- RecursiveTaskCPP
- :
- 101
- :
- 1
- -
- l
- Task status: yielded
- ......
- Child sessions: 102
- Current run task on the slot: 102:1
- Owner of the slot: 101:1
网页界面的输出结果与此类似,请看下图:
点击查看大图
IBM Spectrum Symphony 作为一向关注于性能与可靠性的企业级运算服务管理软件,其天生的基因就适合于在大规模计算机集群中支持各种各样的并行运算算法,满足用户对于大批量数据运算的性能与可靠性的严苛要求。
对于应用于数据分析领域的父子任务工作模式,在 Symphony 所提供的解决方案下,不仅运算的正确性与稳定性得到了保证,其性能也获得了极大的提升。除此之外,用户还可以通过 Symphony 自带的丰富的管理命令和网页界面来实时了解任务运行的状态,资源使用和借用情况等,极大的方便了用户的使用。
Symphony 官方博客
父子任务工作模式的 Symphony 官方文档
父子任务工作模式的用户实例(Parallel FP-Growth Algorithm),三倍性能提升
来源: http://www.ibm.com/developerworks/cn/analytics/library/machine-learning-hands-on1-svn/index.html