跳转到主要内容

通过轮询GCP Pub/Sub主题中新的SampleSheet通知消息来启动bcl2fastq。

项目描述

smon的一个下游工具,它使用Pub/Sub通知来启动Illumina测序运行的解复用。

用例

smon已经完成了其工作,将原始测序运行持久化存储在Google存储桶中。现在需要另一个工具可以自动启动解复用。然而,解复用通常必须等到有SampleSheet后才能开始。但是一旦SampleSheet可用,就需要开始解复用并将结果上传到Google存储。

工作原理

SampleSheets Subscriber (ssub) 通过利用GCP事件和触发器的功能来解决上述挑战。从高层次来看,它的工作方式如下

  1. 用户/应用程序将一个samplesheet上传到专用桶。sample sheet的命名约定是${RUN_NAME }.csv。

  2. Google Storage立即向Pub/Sub主题触发一个事件(每当有新的SampleSheet或者现有的一个被覆盖时)。

  3. 同时,ssub作为一个守护进程在计算实例上运行。它订阅了同一个Pub/Sub主题。ssub定期轮询该主题以获取新消息,即每分钟一次。

  4. 当ssub收到新消息时,脚本会解析关于事件的详细信息。

  5. ssub 将查询 Firestore 集合(与 smon 使用相同的集合)以获取一个名称等于 samplesheet 名称(除去 .csv 部分)的文档。然后 ssub 将下载 samplesheet 和运行 tarball。samplesheet 位置由 Pub/Sub 消息提供;原始运行 tarball 位置由 Firestore 文档提供。

  6. 然后启动 bcl2fastq。

  7. 解复用结果输出在本地运行目录中名为“demux”的文件夹中。

  8. ssub 将 demux 文件夹上传到包含原始测序运行的相同 Google Storage 文件夹。

  9. ssub 将更新相关的 Firestore 文档,以在 Google Storage 中的 demux 文件夹位置添加。

所有处理都在调用目录的 ssub_runs 子目录中完成。

重新分析

由于各种原因,可能需要重新运行解复用流程,例如,解复用结果不再可用,需要重新生成,或者 SampleSheet 中缺少条形码,或者 SampleSheet 中的条形码不正确...

重新分析只需将 SampleSheet 重新上传到 Google Storage,覆盖之前的版本即可轻松完成。Google Storage 会为 SampleSheet 分配一个生成号。将生成号视为 Google Storage 为每次对象更改分配的版本号类型。即使重新上传完全相同的文件,也会产生一个新的生成号。

内部,ssub 在以运行和 SampleSheet 生成号命名的本地目录路径中处理所有操作(文件下载、分析)。因此,用户上传错误的 SampleSheet,然后立即上传正确的一个是可以的。在这种情况下,将运行两个管道,它们不会相互干扰。然而,您会注意到,将有两组解复用结果上传到 Google Storage,每组都存在于以原始生成号命名的文件夹中。

可扩展性

虽然 ssub 中没有并行步骤,但可以通过启动两个或更多 ssub 实例来实现可扩展性,这些实例可以位于单个强大计算实例上,也可以位于不同的实例上。尽管两个运行的 ssub 实例可能会从 Pub/Sub 中拉取相同的信息,但只有其中一个实例实际上会使用它。它的工作方式如下

  1. ssub 的实例 1 从 Pub/Sub 接收一条新消息并立即开始处理它。

  2. 实例 1 下载并解析与 Pub/Sub 消息中详述的 SampleSheet 相关的 Firestore 文档。

  3. 实例 1 注意到文档没有设置 ssub.FIRESTORE_ATTR_SS_PUBSUB_DATA 属性,因此将其设置为 Pub/Sub 消息数据的 JSON 序列化值的值。

  4. 同时,ssub 的实例 2 也已下载了相同的 Pub/Sub 消息。

  5. 实例 2 查询 Firestore 并下载相应的文档。

  6. 实例 2 注意到文档属性 ssub.FIRESTORE_ATTR_SS_PUBSUB_DATA 已经设置,因此下载了此 JSON 值。

  7. 实例 2 然后从从 Firestore 下载的 JSON 值中解析生成号,并注意到生成号与它目前正在处理的 Pub/Sub 消息中的生成号相同。

  8. 实例 2 记录一条消息,表明它正在推迟进一步的处理 - 因此将剩余的工作留给实例 1 完成。

现在让我们退一步,提出一个问题——如果实例2注意到生成数字不同怎么办?在这种情况下,它将继续运行解复用工作流程,因为手头有不同版本的SampleSheet。然而,它首先会将Firestore文档的ssub.FIRESTORE_ATTR_SS_PUBSUB_DATA属性设置为它正在处理的Pub/Sub消息数据的JSON序列化。

注意:如果要在同一实例上使用多个ssub部署,建议在每个工作目录中运行一个。

设置

  1. 你应该已经有一个Firestore集合供smon使用。如果需要,smon会为你创建一个,但如果你想进行手动测试,也可以提前创建一个。有关存储在此集合中的文档结构的详细信息,请参阅smon的文档。

  2. 创建一个专用的Google Storage桶来存储你的SampleSheets,并给它一个有用的名称,例如samplesheets。确保将桶设置为使用细粒度访问控制,而不是统一访问控制。

  3. 创建一个专用的Pub/Sub主题,并给它一个有用的名称,例如samplesheets。

  4. 创建通知配置,以便在向你的samplesheets存储桶添加或修改新文件时,samplesheets Pub/Sub主题会接收到通知。请注意,你可以使用gsutil来完成此操作,具体方法请参阅此处。以下是一个示例命令:

    gsutil notification create -e OBJECT_FINALIZE -f json -t samplesheets gs://samplesheets

    如果在执行此操作时遇到访问拒绝错误,请尝试使用包含的名为create_notification_configuration.py的脚本。它使用GCP Python API,并且与权限配置相关的操作要容易得多。

  5. 创建一个Pub/Sub订阅。例如

    gcloud beta pubsub subscriptions create --topic samplesheets ssub
  6. 定位云存储服务帐户,并授予它pubsub.publisher IAM角色。默认情况下,一个存储桶没有将通知发送到Pub/Sub的权限。遵循GCP文档中的步骤5和6。

邮件通知

如果您的JSON配置文件中设置了“mail”JSON对象,则指定收件人将在以下事件中收到电子邮件通知

  • 主线程中有一个异常

  • 正在处理新的Pub/Sub消息(排除重复项)。

您可以使用send_test_email.py脚本测试您提供的邮件配置是否正常工作。如果一切正常,您应该会收到主题为“ssub测试邮件”的电子邮件。

配置文件

这是一个小的JSON文件,让监控程序知道诸如使用哪个GCP桶和Firestore集合等信息。可能的键包括

  • name:订阅者的客户端名称。如果配置了电子邮件通知,则名称将显示在主题行以及其他地方,例如日志消息中。

  • cycle_pause_sec:在Pub/Sub主题轮询之间的等待秒数。默认值为60。

  • firestore_collection:要用于持久化工作流程状态的Google Firestore集合的名称,下游工具可以查询它。如果它尚未存在,则会创建它。如果未提供此参数,则关闭Firestore支持。

  • sweep_age_sec:当一个分析目录(在ssub_runs目录内)

    的年龄超过这么多秒时,将其删除。默认值为604800(1周)。

用户提供的配置文件将与内置架构进行验证。

安装

在Python3的较新版本中运行

pip3 install ssub

建议使用具有以下角色的服务帐户启动您的计算实例(将运行监控程序)

  • roles/storage.objectAdmin

  • roles/datastore.owner

或者,给你的计算实例赋予cloud-platform范围。

部署

建议使用仓库中提供的Dockerfile。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

ssub-0.2.1.tar.gz (17.3 kB 查看哈希值)

上传时间

构建分布

ssub-0.2.1-py3-none-any.whl (18.6 kB 查看哈希值)

上传时间 Python 3

支持者