亚马逊AWS官方博客

基于 Amazon EKS 在 Pachyderm 框架上 快速搭建 GATK 分析流程

 

Amazon EKS 简化了 Kubernetes 集群的构建与维护,而 Pachyderm 进一步简化了分析类工作流的运行与管理,两者结合,无疑将使得在 Kubernetes 平台上部署企业级分析平台更为轻松。本文通过一个 GATK 基因分析的示例来演示搭建和使用的过程,为您在 Amazon EKS 上采用该解决方案提供参考。

1、基本介绍

Amazon Elastic Kubernetes Service(Amazon EKS)是一项安全、可靠、可扩展的完全托管的Kubernetes服务,近期在AWS中国区域落地以来获得了用户的广泛关注。Amazon EKS可让您在 AWS 上轻松运行 Kubernetes,无需您自行支持或维护 Kubernetes 控制层面,EKS可跨多个AWS可用区来提供高可用特性,并自动将最新的安全补丁应用到您的集群控制平面,因此您可以更专注于应用程序的代码和功能。EKS 可运行上游 Kubernetes,且经认证与 Kubernetes 一致,因此您可以利用社区中开源工具的所有优势。您也可以轻松地将任何标准 Kubernetes 应用程序迁移到 EKS,而无需重构您的代码。

Pachyderm是基于容器和Kubernetes技术的新兴框架组件,用于高效并行分析处理的调度和管理,支持自动扩展以处理大批量作业,支持带GPU的K8S集群,具备企业级应用所需的安全、备份、升级等管理功能。Pachyderm在基因分析、人工智能、机器学习、大数据分析均已有典型的应用案例。目前发布版本是v1.10.0,并提供免费的社区版本。

Amazon EKS简化了Kubernetes集群的构建与维护,而 Pachyderm进一步简化了分析类工作流的运行与管理,两者结合,无疑将使得在Kubernetes平台上部署企业级分析平台更为轻松。本文通过一个GATK基因分析的示例来演示搭建和使用的过程,为您在Amazon EKS上采用该解决方案提供参考。

 

2、部署过程

本解决方案的架构如下图所示:

 

在EKS创建集群后,部署Pachyderm框架时会创建负责工作流管理的pachd、负责提供监视看板数据的dash以及用于持久存储的etcd这几个Pods。通过EC2任务终端上安装的pachctl与pachd进行交互可以创建工作流并提交输入数据,工作流建立时会创建相应pipeline的Pods,pipeline加载ECR中的镜像来执行处理任务,作业相关数据存入S3存储。

2.1 工具准备

通过AWS中国区帐号,在宁夏区域创建一个Amazon Linux 2系统的EC2实例用作管理终端。在AWS的 IAM 控制台上创建一个用于EKS操作的权限,在Roles页面下点击 “创建角色”,”使用案例”中选择 “EC2″搜索并添加AdministratorAccess的策略,角色命名为myEKSadmin。并将该角色与EC2管理终端实例进行绑定。在控制台EC2实例列表中选中管理终端实例,右上角操作中的“实例设置”下点击“附加/替换IAM角色”指定角色为myEKSadmin,如下图所示。

 

以SSH方式登录EC2管理终端,执行以下命令进行工具安装:

#安装基础工具
sudo yum -y install jq gettext bash-completion
aws configure set default.region cn-northwest-1
#创建一个用于存储pachyderm数据的S3存储桶
aws s3 mb s3://<your-data-bucket-name>

#安装基础工具
sudo curl --silent --location -o /usr/local/bin/kubectl https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/amazon-eks-1.15.10/2020-02-22/bin/linux/amd64/kubectl
sudo chmod +x /usr/local/bin/kubectl
kubectl completion bash >>  ~/.bash_completion
. /etc/profile.d/bash_completion.sh
. ~/.bash_completion

#安装eksctl 工具
curl --silent --location "https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/eksctl_Linux_amd64.tar.gz" | tar xz -C /tmp
sudo mv -v /tmp/eksctl /usr/local/bin
eksctl completion bash >> ~/.bash_completion
. /etc/profile.d/bash_completion.sh
. ~/.bash_completion

#安装aws-iam-authenticator工具
sudo curl --silent --location -o /usr/local/bin/aws-iam-authenticator https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/amazon-eks-1.15.10/2020-02-22/bin/linux/amd64/aws-iam-authenticator
sudo chmod +x /usr/local/bin/aws-iam-authenticator

#安装pachctl工具
curl -o /tmp/pachctl.tar.gz -L https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/pachctl.tar.gz 
tar -xvf /tmp/pachctl.tar.gz -C /tmp 
sudo cp /tmp/pachctl_1.10.0_linux_amd64/pachctl /usr/local/bin

#验证工具版本
kubectl version
eksctl version
aws-iam-authenticator version
pachctl version --client-only

 

2.2  创建EKS集群

通过以下命令验证下IAM角色,如显示“IAM role valid”即验证通过。

aws sts get-caller-identity --query Arn | grep myEKSadmin -q && echo "IAM role valid" || echo "IAM role NOT valid"

配置SSH密钥。执行ssh-keygen命令,并在第一个提示信息输入“/home/ec2-user/.ssh/pachnodekey”,随后两次提示均回车。如果EKS集群需要进一步调试可用该pachnodekey以SSH方式登录节点。

ssh-keygen
aws ec2 import-key-pair --key-name "pachnodekey" --public-key-material file://~/.ssh/pachnodekey.pub

以命令行方式创建EKS集群,在十多分钟后提示创建完成,可用“kubectl get nodes”命令查看节点信息。

eksctl create cluster \
--name pachyderm-on-eks \
--region cn-northwest-1 \
--nodegroup-name standard-workers \
--node-type c5.xlarge \
--nodes 2 \
--nodes-min 1 \
--nodes-max 3 \
--ssh-access \
--ssh-public-key ~/.ssh/pachnodekey.pub \
--managed

2.3 部署Pachyderm

Pachyderm要求节点组需要有S3操作的权限,从AWS控制台中的“pachyderm-on-eks“集群的节点组详情信息里找到节点IAM名称:

 

点击链接,在该IAM角色的权限中添加AmazonS3FullAccess策略:

 

部署Pachyderm框架(首行your-data-bucket-name替换成之前创建S3桶的名称):

BUCKET_NAME=<your-data-bucket-name>
echo "export BUCKET_NAME=${BUCKET_NAME}" | tee -a ~/.bash_profile
STORAGE_SIZE=10
echo "export STORAGE_SIZE=${STORAGE_SIZE}" | tee -a ~/.bash_profile
AWS_REGION=cn-northwest-1
echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile
IAM_ROLE=myEKSadmin
echo "export IAM_ROLE=${IAM_ROLE}" | tee -a ~/.bash_profile

pachctl deploy amazon ${BUCKET_NAME} ${AWS_REGION} ${STORAGE_SIZE} --dynamic-etcd-nodes=1 --iam-role ${IAM_ROLE}

部署完成后,可用“kubectl get pod”命令查看到运行的pod信息如下:

 

3、GATK基因分析示例

本示例以标准数据集的NA12878-WGS样本为输入,参考比对信息为b37人类基因参考,调用HaplotypeCaller和GenotypeGVCFs两步处理,分析流程示意图如下:

 

执行以下命令进行数据准备,并按照Pachyderm的流程来创建pipeline及提交数据

#下载示例数据及配置文件
mkdir -p ~/gatkexample
cd ~/gatkexample
wget https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/GATK_Germline.zip
unzip GATK_Germline.zip
wget https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/likelihoods.json
wget https://awshcls.s3.cn-northwest-1.amazonaws.com.cn/pachydermcn/joint_call.json

#创建比对库并上传比对数据
pachctl create repo reference
cd ~/gatkexample/data/ref
pachctl put file reference@master -r -f .
pachctl list file reference@master

#创建样本库并提交示例中的单个样本数据
pachctl create repo samples
cd ~/gatkexample/data/bams/
pachctl start commit samples@master
for f in $(ls mother.*); do pachctl put file samples@master:mother/$f -f $f; done
pachctl finish commit samples@master
pachctl list file samples@master:mother

#创建变体识别(Variant Calling)流程,即触发Pachyderm作业
pachctl create pipeline -f ~/gatkexample/likelihoods.json
pachctl list job
pachctl list file likelihoods@master

#创建联合基因定型( Joint Genotype )流程
pachctl create pipeline -f ~/gatkexample/joint_call.json
pachctl list job
pachctl list file joint_call@master

以上是一个样本的分析处理,可增加更多测试样本进行分析,执行如下命令。

cd ~/gatkexample/data/bams/
pachctl start commit samples@master
for f in $(ls father.*); do pachctl put file samples@master:father/$f -f $f; done
pachctl finish commit samples@master
pachctl start commit samples@master
for f in $(ls son.*); do pachctl put file samples@master:son/$f -f $f; done
pachctl finish commit samples@master
pachctl list file samples@master

列出的结果文件结构如下:

NAME              TYPE                SIZE

father              dir                 9.662MiB

mother            dir                 23.79MiB

son                 dir                 9.58MiB

样本上传后触发对应作业,通过“pachctl list job”命令查看作业完成信息如下所示:

 

在IGV工具里可以查看mother.bam文件和VCF的变体信息如下图所示:

 

在本地新打开一个命令行窗口,通过以下命令登入EC2管理终端:

ssh -L 30080:localhost:30080 -L 30081:localhost:30081 -A ec2-user@<yourEC2publicIP>

 

登入后执行“pachctl port-forward”命令即可在本地浏览器中通过http://localhost:30080/ 查看Pachyderm的UI界面,查看到的作业信息如下图所示。

 

实验完成后,如不再需要使用资源,记得删除EKS集群、S3存储桶、清除对应IAM角色权限,并终止EC2管理终端的实例,步骤参考如下(删除EKS集群前节点组添加的S3权限先予以手动删除)。

pachctl undeploy -a
kubectl get svc --all-namespaces
kubectl delete svc <service-name with EXTERNAL-IP>
eksctl delete cluster --name pachyderm-on-eks
aws s3 rb s3://<your-data-bucket-name>
aws iam delete-role --role-name myEKSadmin
aws ec2 terminate-instances --instance-ids <your-instance-id>

4、参考资源链接

Github参考及更新信息链接:https://github.com/iwillsky/pachydermcn/

Amazon EKS:https://aws.amazon.com/cn/eks/

Amazon EKS WorkShop:https://eksworkshop.com/

Pachyderm官网: https://www.pachyderm.com

Pachyderm Github资源: https://github.com/pachyderm/pachyderm

 

本篇作者

崔向徽

AWS解决方案架构师,目前负责医疗健康与生命科学行业云端应用的架构设计与技术咨询。加入AWS前从事了十余年信息系统研发,设计部署了多个HPC、SOA系统,多次获国家级科技进步奖项。