目录
使用LSF集群执行作业的时候,我们常常需要传输大量的数据,有时是在作业运行之前,需要将作业所需的数据传输到计算节点上;有时是需要将数据从提交作业的集群传输到执行集群。
传统的方法是使用bsub -f指定数据的来源和目标位置,在作业开始后进行传输,或者是将传输动作写在作业的脚本中。但是,取决于数据大小和网络条件,这种数据传输有可能需要花费较长的时间,这种传输方式将传输动作本身也包含在了作业执行的生命周期中。
如果当前的作业是一个需要较多CPU和计算节点的并行作业,或者是需要GPU等昂贵资源的作业,在传输数据的这段时间中,这些资源被作业占用,但却没有实际利用,会导致资源利用率下降和额外的不必要费用。
针对这种情况,LSF提供了一个附属产品——LSF Data Manager。
LSF Data Manager的结构
LSF Data Manager是在集群内设置一个中心存储区域,让集群内的计算节点可以高效地访问这个中心存储区域。
根据具体集群的网络环境,可以几个集群共用一个中心存储区,也可以为不同地点的集群设置不同的中心存储区域。LSF Data Manager会在作业开始之前将作业所需要的源数据缓存到这个中央存储区中,以备使用。
同时每一个集群内都有几个专门的I/O节点可以访问这个中心存储区,最好能为这些I/O节点配备比较好的带宽和网络拓扑,让中心存储区可以通过这些I/O节点与作业所需的外部数据存储区相连通。这些I/O节点不会用于作业的计算,而是专门用于在中心存储区和数据源之间传输数据。
LSF会为每一个作业的数据传输创建专门的data作业,这些data作业只会在I/O节点上运行,作业的内容就是将数据从数据源缓存到中心存储区。将数据传输分离到专门的data作业之后,数据传输过程就从计算作业中独立出来了,当数据没有在中心存储区准备好时,计算作业不会启动,也就不会提前占用珍贵的计算资源。
通过LSF Data Manager为作业传输数据
下面我们通过实际的例子看一下LSF Data Manager为作业传输数据的过程。
假设我们下一个作业需要文件data.txt作为数据源,我们用bsub -data来提交作业<2551>。
-data选项可以指定源数据是某个文件或者目录,可以是共享目录,也可以是某个机器上的独立目录,前提是I/O节点可以正常访问到这些路径。
LSF收到有-data需求的作业后,会通过LSF Data Manager查询当前的中心存储区有没有之前已经通过其他作业传入并储存的文件data.txt,如果有相同文件,就不会再次传输,而是直接使用中心存储区的这个文件来执行作业。
我们通过bdata cache命令也可以手动查询:
如果指定的文件不存在,就会收到在LSF data manager中未找到文件的回复;如果能够找到相应文件,就会将缓存中文件的信息展示出来。
中心存储区在缓存文件时,会将这个文件的原始位置、大小、最后修改时间等属性作为元数据生成一个HASH值,在查询时,我们可以通过这些信息来确定我们想要查找的数据是不是中心存储区中的这一个。
LSF在为作业查询数据时,会先访问用户在-data中提交的原始文件,将原始文件的这些数据与中心存储区的数据进行对比,如果都一致,证明中心存储区的文件就是所需的文件,就会将存储区文件的对应位置发给实际的作业执行节点来使用。
如果数据的属性不完全一致,比如虽然数据位置相同,文件名相同,但是最后修改时间和大小不同,说明这个数据在上一次存储到中心存储区之后有新的变化,这时候,LSF就不会使用现有文件,而是创建一个新的data作业,重新将最新的文件存储到中心存储区。
使用了LSF Data Manager后,每个集群都要创建一个专门用于数据传输的transferQueue,LSF创建data作业时会自动提交到这个队列。这个队列要配置hosts属性,将集群内的I/O节点配置到hosts中,这样,data作业就会专门运行在I/O节点上了。
data作业会与原始的作业关联,当data作业成功结束后,原始作业才会开始调度和运行。
作业<2434>是LSF自动为作业<2433>创建的data transfer作业,当<2434>执行成功后,原始的<2433>才会开始执行。
多个LSF Data Manager之间,基于数据的调度
当多个LSF集群组成Multi-Cluster时,作业可以在这些集群之间传递,以便更快地找到更合适的计算资源。这种跨集群方式,有时不同的集群是在不同的地区的,这种情况下,每个集群最好有自己的中心存储区。这种模式下,多个存储区的LSF Data Manager之间会有更智能的调度方式。
当集群一发现自己没有某个作业所需的计算资源,而集群二和集群三都有的时候,传统方式下,会根据集群二和集群三的负载决定将作业传递到哪个集群。
在配置了LSF Data Manager之后,集群一的Data Manager会提前向集群二和集群三所对应的Data Manager查询谁的中心存储区已经存储了所需的源文件,假设集群三已经有了相同的文件,而集群二还没有,那么作业会被优先传递到集群三,从而尽量避免额外的数据传输。
中心存储区数据的生命周期
为了避免中心存储区存储过多已经不再需要的文件,每一个缓存到中心存储区的文件都有一个生命周期。用户可以在LSF Data Manager中设置CACHE_INPUT_GRACE_PERIOD参数来为缓存文件计算生命周期:
在中心存储区的文件,GRACE的值初始就是参数中设定的CACHE_INPUT_GRACE_PERIOD的值,并且会随着时间慢慢减少, 而一旦有作业通过-data参数使用了这个缓存文件,这个文件的GRACE值就会重置为初始值。当一直没有新的作业使用这个文件,导致GRACE的值减少到0时,LSF Data Manager就会将这个缓存文件清除。
尾声
LSF Data Manager为LSF集群打造了一个数据维度的管理方式,为数据读写频繁的用户创建了一种更高效的作业调度和执行方式。
随着现在云部署的不断发展,大数据AI作业的不断增多,人们对数据的依赖和各种需求也在不断增大,LSF Data Manager还在不断增加着很多新功能。
欢迎关注下方微信公众号【HPC常青园】,共同交流HPC集群管理经验和最佳实践。如果您有关于HPC集群的具体需求,欢迎邮件沟通交流:hpc@ivyent.cn。