使用k8s重构condor集群上的计算任务

585 阅读5分钟
原文链接: guoheng.me

使用k8s重构condor集群上的计算任务

简单说下背景,condor是一个作业调度系统,用来做批处理的离线任务。我们”基因相似度比对”的业务就是跑在condor上面。我们先看下之前基于condor的架构:

  • condor由master和node节点组成,master主要用来分配任务,node用来执行任务(这个和大多数大数据处理的框架一致),没有任务的时候也需要4台master节点常驻
  • 因为计算需要所有人的基因文件,每个几十K,所以每个node启动的时候都要在本地磁盘导入大概几百G的数据
  • condor的任务分配逻辑为每一个人分配一个进程(对应一个核)来计算,和进程内部和全部几十万人的数据一一做比较,一个人计算花费1~2小时左右,我们会同时起多个进程并行计算多个人的结果
  • 如果一段时间之内计算任务较多,就多开机器,计算完毕之后手动关闭
  • 每次计算需要手动登录condor集群投递任务

因为我们主要的生信数据分析流程跑在k8s上面,所以我在想可否把condor的任务放到k8s里面跑,因为这样可以带来如下好处:

  • 可以使用spot实例(之前用的按需实例+预留实例),并且用完node就可以回收,大幅度降低成本(当初我估计可以降低80%)
  • 计算时间更短(我当时预估在半个小时左右跑完),因为我们可以把一个人和几十万人的比对计算并行在多个pod跑(之前的方案是多个人并行跑,但是一个人还是线性跑)
  • 计算更加弹性(之前condor需要手动添加销毁节点)
  • 充分利用我们已有的k8s的生态,比如日志和监控等等

看到了业务价值之后在一个周末就开干了,下面是放到k8s计算之后的架构:

  • 首先有一个服务,该服务会接收启动计算的kafka消息,接收到消息之后会对任务做分片,把几十万人次到几百万人次的比对分割为12万人次*N(为什么是每个Pod计算12万人次后面讲),N就是并行计算的Pod数量。
  • 分割之后的每个12万人次的名单存储到S3里面
  • 分片完毕之后通过argo把任务投递到k8s上面,这样分片之后的任务会在k8s的多个Pod并行跑起来

真正稍微复杂的是Pod的设计:

  • 每个pod启动的时候接收两个环境变量,一个是要比对的人的id,另一个是被比对的12万人的id的名单的S3的地址(pod里面会根据这个id去S3拉取每个用户的数据文件)。
  • 资源方面每个pod限制CPU为1核,内存为2G。资源的限制不应该拍脑袋决策,而是设置了值之后实际跑一下观察资源的使用情况,然后再调整一个合适的值。
  • 我们计算逻辑是go写的,之前的方案是串行跑,没有使用goroutine,导致CPU占用率不高(读写文件的阻塞时间会降低CPU占用率),我修改之后使用goroutine并行计算300个,使用之后发现效果非常好,CPU使用率在90%基本被打满了。
  • 文件存储是一个大问题,之前在condor集群跑的时候文件是提前下载到机器上的,而我们在k8s里面跑的时候不能这么搞,因为每次node启动的时候就要同步全量的数据意味着每台k8s里面的pod都要挂载一个200G+的盘,这是不现实的,所以只能计算的时候拉下来,但这也有一个问题,如果一个Pod需要拉12W人的数据,大概是5G,那么36核机器对应36个Pod就是需要180G的盘,这个也不现实。所以我们的方案是“拉文件->计算->删文件”,边拉边删,使得Pod的磁盘消耗不会陡增。得益于goroutine,拉文件这种网络IO和文件操作的磁盘IO操作并不会block CPU的计算,所以整体CPU利用率非常高。
  • 每个Pod计算多少人次?这个根据我们想让Pod运行多久有关,我的想法是一个Pod最好在40分钟左右跑完,因为时间再短粒度就太细了,造成Pod增多,Pod增多之后可能Pending状态的Pod就会增多(因为Node数量有上限),时间太长也不好,这样一个人的计算时间就会被拉长并且在spot节点上运行的任务越长被杀掉的机会就越大(因为spot实例会被回收)。
  • Pod退出怎么办?argo可以设置重试次数,Pod退出之后可以被重新启动计算。在spot实例跑的任务一定要做好容错,因为spot实例会被云供应商回收。比如有人购买按需实例,供应商可能从spot的池子中回收卖给购买按需实例的人。
  • 选择什么机器跑?为了追求极致的性能和性价比我选择了C5系列的EC2,一个是CPU频率高达3.6GHZ非常适合跑计算密集型的业务,另一个是价格便宜,官方声称比C4系列性价比提升25%。(在公有云跑任务,一定要挑选合适的机器,这个对服务的性能和公有云费用影响很大)

整套方案实施下来确实达到了当初的目标:

  • 更省钱:计算一个人的和全部人的基因相似度价格降低到2~3分钱,价格降低了98%!!!
  • 更快:之前承诺给用户两个周出来数据,现在只需要一个小时!!
  • 更弹性:一次来100个用户和一次来1W个用户对我们来说没有任何区别
  • 更自动化:整个过程完全无人监管,完全自动化

用技术创新来创造业务价值的感觉真好😆