内容


IBM Spectrum LSF 扩展云端资源的应用实践

Comments

大数据和云计算是带动 IT 界快速发展的两大火车头。在快速发展的大数据时代,大数据平台需要新处理技术和硬件资源,才能具有更强的洞察发现力和流程优化能力,才能适应和处理高增长和多样化的信息资产,这其中缺少不了云计算所提供的强大而又安全的并行计算和分布式计算能力。所以,大数据与云计算之间,并非独立运作的,而是相辅相成的,云计算为大数据提供强大平台,而大数据分析出的结论又体现了云计算价值。本文有效的将一种大数据并行处理技术和云计算平台有效的结合起来,展示了二者结合的威力。

IBM Spectrum LSF (Load Sharing Facility,以下简称 LSF)是一种强大的工作负载管理平台,也是并行计算的领军技术之一,利用分布式的基础架构资源来提高整体的系统性能,被广泛的应用到了大数据处理场景中。在过去二十年里,绝大多数 LSF 客户将集群部署在本地,但是随着数据量的不断增加,计算能力也亟待提高,本地 LSF 集群有时候不能满足日益增长的计算需求。当这种情况发生的时候,LSF 用户不希望再购置昂贵的服务器,而是希望将集群临时扩展到云端,结合云端的资源进行计算和存储,使用完毕后立即释放,进而节省购置开销和维护成本。所以如何将 LSF 计算集群扩展到云端,是当前亟待解决的问题。目前主流的云平台有 IBM Cloud 和 AWS 等,这些云平台可以提供一整套基础设施和云解决方案,有效的满足用户的实时资源需求,并且大幅度的降低了成本。本文详细展示了如何让 LSF 有效的资源扩展到云端,并以 IBM Cloud 为例,实践了整个扩展过程。

IBM Spectrum LSF 的原理与简介

LSF 是一种强大的工作负载管理平台,提供基于各种策略的智能调度功能,利用分布式的基础架构资源来提高整体的系统性能。同时,LSF 支持跨集群工作,用户可以通过 LSF,来实现集群间的负载均衡,扩展集群构架和资源,最大限度的提高集群的使用效率。

LSF 将多个集群连接在一起,一个集群往往是企业中的一个部门,每个集群中有一个主控机,此主控机负责收集该集群系统中的各台主机的负载信息,并且根据各主机的负载信息情况对作业进行调度。各个集群系统之间根据一定的策略进行资源共享。在每个主控机上定义了该集群能共享哪些集群系统中的资源。当用户发送了一个任务请求时,LSF 系统能将此任务发送到对应的资源所在地,并根据调度策略选择负载较轻的机器对此任务进行处理。当多个用户请求同一个资源时,根据用户的请求优先级来确保优先级高的用户的紧急任务能首先得到满足。

图一. 本地 LSF 架构和工作原理

大致工作流程为:用户在客户端提交一份作业,此作业进入相应的队列等待执行。后台的主进程 mbatchd 按照已经设定的计划传递给调度进程 mbschd,mbschd 根据作业的优先级等参数选择合适的计算资源。主负载信息管理进程 lim 只要负责收集资源的信息,并与 mbatchd 主进程交流这些信息。然后由 mbatchd 主进程一收到 mbschd 发过来的决定,立即分配作业到相应的主机。然后由从属批处理进程(sbatchd)来执行此作业,并将运行结果,包括错误信息返回给 mbatchd。最后,mbatchd 给提交主机反馈作业输出信息、作业错误、提示信息、作业信息等。

关于 LSF 详细的工作流程,可以参考文章"Spark 和 IBM LSF 深度集成与实战"。

公有云资源的简述

公有云资源通常指第三方提供商为用户提供的能够使用的计算资源,这些公有的计算资源一般可通过 Internet 访问,可能成本低廉的或者甚至免费。云计算资源安全性较高,提供了最可靠、最安全的数据存储中心,用户不用再担心数据丢失、病毒入侵等麻烦。并且对用户端的设备要求最低,使用起来也最方便。云计算可以轻松实现不同设备间的数据与应用共享。总之,云计算为我们提供了各种可能的方案和资源,为存储和管理数据提供了几乎无限多的空间,也为我们完成各类应用提供了非常强大的计算能力。

在混合云领域,IBM Cloud 一直处于处于行业标杆地位,IBM Cloud 基于开放标准的开发云平台,可以让用户快速实现跨平台应用的构建、部属和管理。IBM Cloud 的云基础设施即服务(IaaS)SoftLayer,为用户强化最需要的云应用程序,SoftLayer 提高虚拟的主机和专业服务器(比如 Power 服务器),可供用户选择,同事也提供了自动化服务,仅需要几分钟,在虚拟服务器上可完成部署,数十分钟,便可在强大的物理机上完成部署。SoftLayer 的服务全部由一套高度集成的、全球化的管理平台来实现,遍布全球的强大网络支持和数据中心资源,可以为使用者在各方面提供最好的支撑服务。同时还提供了单一的管理平台入口,来控制和协调所有服务和资源。2016 年 10 月,IBM 将 SoftLayer 重塑,将其作为 IBM Cloud PaaS 的扩展,很大程度上提升了的用户体验。与此同时,IBM 将很多大数据领域的相关软件迁移到 IBM Cloud 中,以便用户可直接在云端享用硬件资源的同时,可以快捷方便的使用大数据集群技术。这为很多初创公司和不愿意再大规模投资建设硬件机房的公司带来福音,相对传统模式来说,用户只需要按照时间来支付较少的费用。

大数据在云端的部署有两种方式,一种方式是直接将大数据集群(包括管理节点、计算节点和存储节点等)全部部署到云端,用户只需要远程控制云端的管理节点。二是用户将主要的管理节点部署到本地机房,如果计算资源或者存储资源不够的时候,比如用户的作业出现高峰期,用户可及时随时随地向云端申请资源,如果作业完成,即可释放资源。第二种方式即为混合云模式,有很好的兼容性,故而得到很多用户的青睐。

LSF 支持从 SoftLayer、AWS、OpenStack、Microsoft Azure 等云平台"借用"资源。在下文中,我们仅仅以目前最为常见的 SoftLayer 和 AWS 为例来阐述如何配置。

LSF 扩展云端资源的构架

如前文所述,对于目前大多数 LSF 的用户,都将集群部署到了本地,或者企业的内部云,其主要构架如图一所示。计算属于一种"预先设定、自给自足"的模式,在队列中的作业只能等待靠前的作业或者高优先级的作业完成之后,才能得到执行。如此一来,对于部分实时性要求比较高的用户,或者作业量会随着时间波动的用户,无疑是难以接受的。云计算资源的出现,为解决这一问题,提供了很好的契机。当本地资源满足不了的时候,可以在云端临时申请资源,并划分到 LSF 集群中,对于 LSF 来说,这些资源和本地资源是平等的,分配任务的计算方式也是相同的(特殊设定除外),如图二所示。

图二. 混合云下的 LSF 构架和作业处理流程

从上图,我们可以看出,Compute Hosts 分为 Local 和 Cloud 两种,这是一种典型的混合云的部署方法。作业运行到 Cloud Compute Hosts 的条件有两个:一是当本地资源不足的时候,二是特殊的标签设置,作业提交的时候,指定了计算资源类型为云资源。第二种主要是由于一些作业需要运行到一个特定的大型机上,或者满足此作业的特殊硬件设备上。总体上来说,在保证高性能传输的情况下,对于客户端来说,并不关心也感觉不到作业在哪里得到了执行。图二展示的是将云端资源加入到一个 LSF 集群中,事实上,LSF 也可以支持多个集群之间的资源借用和调配。

LSF 扩展云端资源的配置

要做到 LSF 管理节点可以从云平台"借到"资源,LSF 管理节点的配置必不可少。具体的配置步骤如下:

  1. 登录 LSF 管理节点,建议用 root 用户或者集群管理员登录。此功能从最新的 LSF10.1.0.3 开始支持,对于 LSF 老版本的客户,需要先安装最新的 Fix Pack 10.1.0.3。
  2. 配置网络和 DNS。LSF 管理节点需要和云端的计算资源互通,互通的前提是保证 VPN 和网络安全设置,允许 LSF 管理节点和计算节点之间的报文通过,而且要保证 DNS 配置正确,以便 LSF 管理节点和云端资源能够相互解析。云端的 DNS 也需要相应的配置。
  3. 配置 Scheduler 模块。在$LSF_CONF/lsbatch/cluster0802/configdir/文件夹下,编辑 lsb.modules 文件,添加如下配置:
    schmod_demand               ()                  ()
  4. 定义 Boolean 资源,指定资源从云平台"借用"。编辑$LSF_CONF/lsf.shared,添加如下配置,分别配置 Softlayer 云端资源和 AWS 云端资源。
    awshost      Boolean  ()       ()     (Hosts borrowed from AWS)
    softlayercomp  Boolean  ()       ()       (SoftLayer compute host)
  5. 激活 Resource Connector 功能。编辑$LSF_CONF/lsf.conf,添加如下(分别为 AWS 和 softlayer)。
    LSB_RC_EXTERNAL_HOST_FLAG=softlayercomp
    LSB_RC_EXTERNAL_HOST_FLAG=awshost
  6. 定义 RC_HOSTS 参数,在$LSF_CONF/lsbatch/cluster0802/configdir/文件夹下,编辑 lsb.queues,添加:
    RC_HOSTS = none | all | host_type

    其中,host_type 需要和上一步的 LSB_RC_EXTERNAL_HOST_FLAG 相同或者为其中的一个子集。

  7. 在$LSF_CONF/lsf.conf 中,定义动态加入 host 的参数:
    ENABLE_DYNAMIC_HOSTS=Y
    LSF_REG_FLOAT_HOSTS=Y
    LSF_DYNAMIC_HOST_WAIT_TIME=2 (此值可根据 Cluster 大小设定)
  8. 定义 LSF_HOST_ADDR_RANGE,在 lsf.cluster.cluster_name 文件中,添加类似于如下的配置:
    Begin Parameters
    LSF_HOST_ADDR_RANGE=192.168.1.*   
    End Parameters
  9. 在 lsb.queues 参数中,定义 RC_DEMAND_POLICY,语法如下:
RC_DEMAND_POLICY = THRESHOLD[ [ num_pend_jobs[,duration]] … ]

举例如下:

RC_DEMAND_POLICY = THRESHOLD[ [ 5, 10] [1, 60] [100] ]

以上是必须的配置,可选的配置不在此文中赘述。完成配置之后,需要重启 LSF,使得这些参数生效。重启的方法如下:

lsadmin limrestart
lsadmin resrestart
badmin mbdrestart

云平台的配置

云平台的配置,需要创建账号、创建 VPN,创建 image、创建 VLAN 和其他网络安全机制等。方法大致相同,此文中,仅仅以在 SoftLayer 创建 image 模板为例,来说明配置的步骤和方法。其他的配置,可参见各个云平台的指导文档。

  1. 创建一个 VM instance.
    • 登录 SoftLayer 门户网站 https://control.softlayer.com/.
    • 点击"Devices"来申请一台虚拟机
    • 在"Advanced System Configuration "中,选择 Host 和 Domain.
    • 提交此申请,此时用户将收到一份邮件。
    • 可以在 Check Devices > Device List 查阅此 instance。
  2. 在 instance 上安装 LSF
    • 将以下包拷贝到此 instance.
      lsf10.1_lnx310-lib217-x86_64.tar.Z
      lsf10.1_lsfinstall_linux_x86_64.tar.Z
    • 配置 DNS,使得此 instance 可以解析 LSF 管理节点。
    • 解压 lsf10.1_lsfinstall_linux_x86_64.tar.Z,编辑 slave.config,配置以下参数:
      	LSF_TOP="/home/bmuser/lsf"
      	LSF_ADMINS="bmuser"
      	LSF_TARDIR="/home/bmuser/lsf/"
      	LSF_ENTITLEMENT_FILE="/home/bmuser/lsf/lsf_std_entitlement.dat"
      	LSF_SERVER_HOSTS="master.myserver.com"
      	LSF_LOCAL_RESOURCES="[resource softlayercomp] [resource define_ncpus_threads]"
      	LSF_LIM_PORT="7869"
    • 运行以下命令在云端 instance 来安装 LSF。
    	./lsfinstall -s -f slave.config
  3. 创建 instance image 模板
    • 在 Devices > Device List > Device Details > Actions 下,选 Image Name,点击 Create Image Template 来创建 image 模板。在后续"借用"资源的时候,直接从此 image 下来创建出 instance,并加入到 LSF cluster 中。
  4. 修改启动脚本
    • 以下脚本是在"借用"资源的时候,当 instance 从 image 模板创建出来后,运行的第一个脚本,用户可以自行的修改这个脚本来完成一些特殊的设置。在以下例子中,我们对 instance 做了以下设置,并启动了 LSF,让此 instance 可以自动的加入到 LSF 集群中。
    清单 1. 自动化启动脚本
          #!/bin/bash
          logfile=/var/log/postprovisionscripts.log
          echo START `date '+%Y-%m-%d %H:%M:%S'` >> $logfile
          #Do not remove this part of the script to support passing LSF user data to VM run time environment
          STARTTIME=`date +%s`
          TIMEOUT=60
          URL="https://api.service.softlayer.com/rest/v3/SoftLayer_Resource_Metadata/getUserMetadata.txt"
          USERDATA=`curl -s $URL` 2>>$logfile
          #
          while [[ "$USERDATA" == [Nn]"o user data"* ]] && [[ `expr $NOWTIME - $STARTTIME` -lt $TIMEOUT ]]; do
             sleep 5
             NOWTIME=`date +%s`
             USERDATA=`curl -s $URL` 2>>$logfile
          done
          
          # check if we got user data eventually
          if [[ "$USERDATA" != [Nn]"o user data"* ]]; then
             # user data is expected to be a semicolon-separated key=value list
             # like environment variables; split them into an array
             IFS=\; read -ra ARR <<<"$USERDATA"
             for VAR in ${ARR[@]}; do
                eval "export $VAR"
             done
          else
             echo "USERDATA: $USERDATA" >>$logfile
             echo EXIT AT `date '+%Y-%m-%d %H:%M:%S'` >>$logfile
             exit -1
          fi
          echo "CURRENT ENVIRONMENT:" >>$logfile
          env >> $logfile
          
          #Set the correct path for LSF_TOP, where LSF is installed on the VM host
          LSF_TOP=/opt/lsf
          LSF_CONF_FILE=$LSF_TOP/conf/lsf.conf
          source $LSF_TOP/conf/profile.lsf
          
          #Do not remove this part of the script to support rc_account resource for SoftLayer
          #You can similarly set additional local resources if needed
          if [ -n "${rc_account}" ]; then
             sed -i "s/\(LSF_LOCAL_RESOURCES=.*\)\"/\1 [resourcemap ${rc_account}*rc_account]\"/" $LSF_CONF_FILE
             echo "update LSF_LOCAL_RESOURCES lsf.conf successfully, add [resourcemap ${rc_account}*rc_account]" >> $logfile
          fi
          
          #If there is no DNS server to resolve host names and IPs between master host and VMs,
          #then uncomment the following part and set the correct master LSF host name and IP address
          #master_host='hostm.example.com'
          #master_host_ip='10.115.206.151'
          #echo ${master_host_ip} ${master_host} >> /etc/hosts
          #echo $master_host > $LSF_ENVDIR/hostregsetup
          #lsreghost -s $LSF_ENVDIR/hostregsetup
          
          #Start LSF Daemons in dynamic VM host.
          lsadmin limstartup
          sleep 5
          lsadmin resstartup
          badmin hstartup
          
          echo END AT `date '+%Y-%m-%d %H:%M:%S'` >> $logfile

在云上运行 LSF 作业

  1. 提交作业,有两种方式,一种是直接提交作业,当本地资源不足的时候,LSF 管理节点自动此云端申请资源,如下:

    bsub myjob

    另外一种是,可以直接指定作业的执行资源为云端资源。提交的方式如下:

    bsub -R "select[softlayercomp]" myjob

  2. 接下来,管理节点会根据需求调 API 向云端申请资源。需要说明的是从 SoftLayer 申请资源,大概需要 20 分钟,也就是说作业可能会 Pending 20 分钟后,才能得到执行。申请到资源之后,可以用 bhosts 来查看资源。例如:

    bhosts -a

    HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV

    lsfmaster ok - 1 0 0 0 0 0

    slhost01 ok - 1 1 1 0 0 0

  3. 作业运行过程中,可以根据 bjobs 命令来查到作业的执行情况,以及作业运行的资源。

    Bjobs -l JOB_ID

  4. 作业运行完之后,资源即被释放,可以运行 bhosts 来确定。

    bhosts -a

    HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV

    lsfmaster ok - 1 0 0 0 0 0

    slhost01 unavail - 1 0 0 0 0 0

    此时可以看到,机器的状态为 unavail,说明此资源以及被释放。

结束语

IBM Spectrum LSF 一直是处于大数据和并行计算行业一直处于领头羊的地位,其客户广泛的分布在金融、学校、科研、石油等行业。LSF 除了本身的资源调度、监视、分析负载,然后对 Cluster 机群的资源统一调度和监控等功能外,还提供了一系列的可选附加组件(add-on),比如 IBM Spectrum Application Center、IBM Spectrum Process Manager,IBM Spectrum RTM 和 IBM Spectrum Explorer 等,旨在帮助其实现工作负载管理、进而提升用户生产效率,这些组件也可以扩展到云平台上,提高用户体验的同时,高效的完成分析计算。 LSF 和其 Add-on 组件应用越来越广泛,随着部分大客户的数据量激增,迫切需要扩大集群,提升计算能力。在预算有限的情况下,用户希望将集群扩展到云端,形成混合云的局面。本文实践了一种将 LSF 集群扩展到云端的方法,同时希望对大数据和云计算的结合有借鉴意义。

参考资源


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Big data and analytics
ArticleID=1050013
ArticleTitle=IBM Spectrum LSF 扩展云端资源的应用实践
publish-date=09202017