在 Batch 上运行 dsub 流水线以编排作业


本教程介绍了如何在 Batch 上运行 dsub 流水线。具体来说,示例 dsub 流水线会处理 二进制比对图 (BAM) 文件中的 DNA 测序数据,以创建 BAM 索引 (BAI) 文件。

本教程面向想要将 dsub 与 Batch 搭配使用的 Batch 用户。dsub 是一款开源作业调度程序,用于在 Google Cloud上编排批处理工作流。如需详细了解如何将 Batch 与 dsub 搭配使用,请参阅 dsub 的 Batch 文档

目标

  • 在 Batch 上运行 dsub 流水线,该流水线可读取和写入 Cloud Storage 存储分区中的文件。
  • 查看 Cloud Storage 存储桶中的输出文件。

费用

在本文档中,您将使用 Google Cloud的以下收费组件:

  • Batch
  • Cloud Storage

您可使用价格计算器根据您的预计使用情况来估算费用。 新 Google Cloud 用户可能有资格申请免费试用

如果您及时完成本教程中的所有步骤(包括清理),那么在此期间所创建资源的费用通常不会超过 1 美元。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.

  3. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  4. To initialize the gcloud CLI, run the following command:

    gcloud init
  5. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Batch, Cloud Storage, Compute Engine, and Logging APIs:

    gcloud services enable batch.googleapis.com compute.googleapis.com logging.googleapis.com storage.googleapis.com
  8. Install the Google Cloud CLI.

  9. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  10. To initialize the gcloud CLI, run the following command:

    gcloud init
  11. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Make sure that billing is enabled for your Google Cloud project.

  13. Enable the Batch, Cloud Storage, Compute Engine, and Logging APIs:

    gcloud services enable batch.googleapis.com compute.googleapis.com logging.googleapis.com storage.googleapis.com
  14. 确保您的项目至少有一个服务账号,且该账号具有本教程所需的权限。

    每个作业都需要一个服务账号,以便 Batch 服务代理创建和访问运行作业所需的资源。在本教程中,作业的服务账号是 Compute Engine 默认服务账号

    为确保 Compute Engine 默认服务账号具有必要的权限,以允许 Batch 服务代理为 Batch 作业创建和访问资源,请让您的管理员为 Compute Engine 默认服务账号授予以下 IAM 角色:

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    您的管理员也可以通过自定义角色或其他预定义角色为 Compute Engine 默认服务账号授予所需的权限。

  15. 确保您拥有本教程所需的权限。

    如需获得完成本教程所需的权限,请让您的管理员为您授予以下 IAM 角色:

  16. 安装 dsub 及其依赖项。如需了解详情,请参阅安装文档dsub

    1. 确保您已安装最新版 dsub 支持的 Pythonpip 版本。 如需查看当前已安装的版本,请运行以下命令:

      pip --version
      

      如果您需要安装或更新 pip 或 Python,请按照安装 Python 的步骤操作。

    2. 建议:为防止在安装 dsub 时出现依赖项冲突错误,请创建并激活 Python 虚拟环境

      python -m venv dsub_libs && source dsub_libs/bin/activate
      
    3. 使用 git 克隆 dsub GitHub 代码库并打开它:

      git clone https://github.com/databiosphere/dsub.git && cd dsub
      
    4. 安装 dsub 及其依赖项:

      python -m pip install .
      

      输出类似于以下内容:

      ...
      Successfully installed cachetools-5.3.1 certifi-2023.7.22 charset-normalizer-3.3.1 dsub-0.4.9 funcsigs-1.0.2 google-api-core-2.11.0 google-api-python-client-2.85.0 google-auth-2.17.3 google-auth-httplib2-0.1.0 google-cloud-batch-0.10.0 googleapis-common-protos-1.61.0 grpcio-1.59.0 grpcio-status-1.59.0 httplib2-0.22.0 idna-3.4 mock-4.0.3 parameterized-0.8.1 proto-plus-1.22.3 protobuf-4.24.4 pyasn1-0.4.8 pyasn1-modules-0.2.8 pyparsing-3.1.1 python-dateutil-2.8.2 pytz-2023.3 pyyaml-6.0 requests-2.31.0 rsa-4.9 six-1.16.0 tabulate-0.9.0 tenacity-8.2.2 uritemplate-4.1.1 urllib3-2.0.7
      

创建 Cloud Storage 存储桶

如需使用 gcloud CLI 创建 Cloud Storage 存储桶来存储示例 dsub 流水线的输出文件,请运行 gcloud storage buckets create 命令

gcloud storage buckets create gs://BUCKET_NAME \
    --project PROJECT_ID

替换以下内容:

输出类似于以下内容:

Creating gs://BUCKET_NAME/...

运行 dsub 流水线

示例 dsub 流水线对来自 1,000 Genomes Project 的 BAM 文件编制索引,并将结果输出到 Cloud Storage 存储桶。

如需运行示例 dsub 流水线,请运行以下 dsub 命令:

dsub \
    --provider google-batch \
    --project PROJECT_ID \
    --logging gs://BUCKET_NAME/WORK_DIRECTORY/logs \
    --input BAM=gs://genomics-public-data/1000-genomes/bam/HG00114.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam \
    --output BAI=gs://BUCKET_NAME/WORK_DIRECTORY/HG00114.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam.bai \
    --image quay.io/cancercollaboratory/dockstore-tool-samtools-index \
    --command 'samtools index ${BAM} ${BAI}' \
    --wait

替换以下内容:

  • PROJECT_ID:您的 Google Cloud 项目的项目 ID

  • BUCKET_NAME:您创建的 Cloud Storage 存储桶的名称。

  • WORK_DIRECTORY:流水线可用于存储日志和输出的新目录的名称。 例如,输入 workDir

dsub 流水线会运行一个批处理作业,该作业会将 BAI 文件和日志写入 Cloud Storage 存储桶中的指定目录。具体来说,dsub 代码库包含一个预构建的 Docker 映像,该映像使用 samtools 为您在 --input 标志中指定的 BAM 文件建立索引。

该命令在 dsub 流水线运行完毕之前不会完成,而流水线运行完毕的时间可能会因 Batch 作业的调度时间而异。通常,这需要大约 10 分钟:Batch 通常会在几分钟内开始运行作业,而作业的运行时约为 8 分钟。

起初,该命令仍在运行,输出类似于以下内容:

Job properties:
  job-id: JOB_NAME
  job-name: samtools
  user-id: USERNAME
Provider internal-id (operation): projects/PROJECT_ID/locations/us-central1/jobs/JOB_NAME
Launched job-id: JOB_NAME
To check the status, run:
  dstat --provider google-batch --project PROJECT_ID --location us-central1 --jobs 'JOB_NAME' --users 'USERNAME' --status '*'
To cancel the job, run:
  ddel --provider google-batch --project PROJECT_ID --location us-central1 --jobs 'JOB_NAME' --users 'USERNAME'
Waiting for job to complete...
Waiting for: JOB_NAME.

然后,在作业成功完成后,该命令会结束,输出类似于以下内容:

  JOB_NAME: SUCCESS
JOB_NAME

此输出包括以下值:

  • JOB_NAME:作业的名称。

  • USERNAME:您的 Google Cloud 用户名。

  • PROJECT_ID:您的 Google Cloud 项目的项目 ID

查看输出文件

如需使用 gcloud CLI 查看由示例 dsub 流水线创建的输出文件,请运行 gcloud storage ls 命令

gcloud storage ls gs://BUCKET_NAME/WORK_DIRECTORY \
    --project PROJECT_ID

替换以下内容:

  • BUCKET_NAME:您创建的 Cloud Storage 存储桶的名称。

  • WORK_DIRECTORY:您在 dsub 命令中指定的目录。

  • PROJECT_ID:您的 Google Cloud 项目的项目 ID

输出类似于以下内容:

gs://BUCKET_NAME/WORK_DIRECTORY/HG00114.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam.bai
gs://BUCKET_NAME/WORK_DIRECTORY/logs/

此输出包括 BAI 文件和一个包含作业日志的目录。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

避免产生费用的最简单方法是删除当前项目。

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

删除各个资源

如果您想继续使用当前项目,请删除本教程中使用的各个资源。

删除存储桶

流水线运行完成后,会在 Cloud Storage 存储桶的 WORK_DIRECTORY 目录中创建并存储输出文件。

如需减少当前Google Cloud 账号的 Cloud Storage 费用,请执行以下操作之一:

  • 如果您不再需要本教程中使用的存储桶,请使用带有 --recursive 标志的 gcloud storage rm 命令删除该存储桶及其所有内容:

    gcloud storage rm gs://BUCKET_NAME \
        --recursive \
        --project PROJECT_ID
    

    替换以下内容:

    • BUCKET_NAME:您创建的 Cloud Storage 存储桶的名称。

    • PROJECT_ID:您的 Google Cloud 项目的项目 ID

  • 否则,如果您仍需要该存储桶,请将 gcloud storage rm 命令--recursive 标志结合使用,以仅删除 WORK_DIRECTORY 目录及其所有内容:

    gcloud storage rm gs://BUCKET_NAME/WORK_DIRECTORY \
        --recursive \
        --project PROJECT_ID
    

    替换以下内容:

    • BUCKET_NAME:您创建的 Cloud Storage 存储桶的名称。

    • WORK_DIRECTORY:您在 dsub 命令中指定的目录。

    • PROJECT_ID:您的 Google Cloud 项目的项目 ID

删除作业

如需使用 gcloud CLI 删除作业,请运行 gcloud batch jobs delete 命令

gcloud batch jobs delete JOB_NAME \
    --location us-central1 \
    --project PROJECT_ID

替换以下内容:

  • JOB_NAME:作业的名称。
  • PROJECT_ID:您的 Google Cloud 项目的项目 ID

后续步骤