寻找新的Illumina测序运行并将它们打包到GCP存储
项目描述
一种将新的Illumina测序运行存档到Google云存储的工具
用例
您有一台或多台Illumina测序仪正在写入挂载的文件系统,如NFS。您需要一种方法来检测何时有新的、已完成的测序运行目录,并将其重新定位到冗余存储。下游工具需要能够知道打包的运行目录何时可供后处理(即:解复用、质量控制、读取对齐等)。
工作原理
通过使用Google云平台服务和跟踪工作流程状态来解决上述挑战。测序运行使用gzip压缩打包,然后上传到Google云存储。工作流程状态通过SQLite在本地跟踪,并可选择在Google Firestore NoSQL数据库中跟踪,以提高冗余性,并允许下游客户端查询测序运行记录。
注意:虽然您不需要使用Google计算实例来运行监控脚本,但此处的文档假设您正在这样做,因为这是最推荐的方式。这是因为监控必须与某些GCP服务交互,因此必须使用有效的Google凭证(即服务账户)。
监控脚本名为 srun-mon(一个调用 launch_monitor.py 中 main 函数的封装)。运行此脚本时,您必须提供指向 JSON 配置文件的路径,下面将详细说明。您应该将计算实例配置为以守护进程服务运行此脚本。
工作流程被分为两个任务:tar 任务 和 上传任务。当监控检测到新的测序运行时,它将在子进程中执行工作流程。该工作流程足够智能,能够检测从哪个任务开始,这得益于本地 SQLite 数据库。该数据库为每个测序运行记录一条记录,并跟踪哪些工作流程任务已完成,以及工作流程是否正在运行。
邮件通知
如果您的配置文件中设置了‘mail’ JSON 对象,则指定收件人将在以下事件下收到电子邮件通知:
执行工作流程的子进程崩溃
子进程因运行时间过长而被终止(请参阅 conf 参数 task_runtime_limit_sec)
主线程中发生异常
正在处理新的测序运行。
您可以使用脚本 send_test_email.py 来测试您提供的邮件配置是否正常工作。如果是,您应该会收到主题为“sruns-mon 测试邮件”的电子邮件。
工作流程任务
工作流程分为两个任务,每个任务都可以单独运行(即如果工作流程需要从上次停止的地方重新启动)。
tar 任务
创建一个使用 gzip 压缩的 tarball。进程 ID 存储在 SQLite 数据库的本地运行记录中。
上传任务
将 tar 文件上传到 Google 存储桶。此任务从本地数据库获取运行记录,以获取本地 tar 文件的路径。
配置文件
这是一个小的 JSON 文件,它让监控知道诸如使用哪个 GCP 存储桶和 Firestore 集合等问题。可能的键包括:
name:监控器的名称。如果配置了电子邮件通知,则名称将出现在主题行中,以及其他位置,例如日志消息。
completed_runs_dir:在运行完成工作流程后将运行目录移动到的目录。如果该目录尚不存在,则会创建该目录。默认为位于监视同一目录下的名为‘SRM_COMPLETED’的文件夹。请注意,目前还没有清除完成运行的目录的方法,但这将在未来的版本中实现。
cycle_pause_sec:在扫描 watchdir 之间等待的秒数。默认为 60。
firestore_collection:用于持久化工作流程状态并允许下游工具查询的 Google Firestore 集合的名称。如果尚不存在,则将其创建。如果未提供此参数,则关闭 Firestore 支持。
gcp_bucket_basedir:(必需)在 gcp_bucket_name 中存储所有上传文件的目录。默认为根目录。
gcp_bucket_name:(必需)要上传打包运行目录的 Google 云存储桶的名称。
sentinal_file_age_minutes:在启动任何任务之前,例如对运行目录进行打包,哨兵文件(即 CopyComplete.txt)应该有多久的时间。Illumina 支持建议为 15 分钟,因此默认值为 15 分钟。这有助于确保测序仪上运行的 Illumina Universal Copy Services (UCS) 在哨兵文件出现后有足够的时间完成。
sqlite_db:用于跟踪工作流程状态的本地 SQLite 数据库名称。如果未指定,则默认为 sruns.db。
sweep_age_sec:当完成运行的目录中的运行比这个秒数旧时,将其删除。默认为 604800(1 周)。
task_runtime_limit_sec:子进程在被终止前允许运行的时间(秒)。这旨在作为安全机制,以防由于不可预见的情况导致资源被错误进程消耗。在这种情况下,将发送一封电子邮件通知,以提醒有关错误进程及其关联的测序运行。您为该设置设置的秒数取决于多个因素,例如运行大小和网络速度。建议至少使用两天(172800秒)以保持保守。
watchdir:(必需)监视新测序运行的目录。
用户提供的配置文件在监视器中对内置架构进行验证。
跟踪工作流程状态
针对给定运行目录的工作流程状态同时在本地SQLite数据库以及Google Firestore(一个NoSQL数据库)中进行跟踪。本地状态跟踪是为了能够重新启动工作流程,如果子进程崩溃或节点关闭,可以重新启动工作流程。Firestore用于允许下游应用程序查询集合(其名称在您的配置文件中指定)以执行所需的后期处理。例如,外部工具可以查询集合,并询问是否已完成特定的运行。在此意义上,“完成”意味着运行已打包并上传到Google存储桶。然后,该工具可以告知tar文件blob的位置。
SQLite
每个测序运行都有一个记录,存储在tasks表中 - 这是唯一的表。可能的字段有
name:测序运行的名字。
pid:正在运行或已运行的工作流程的进程ID。
tarfile:由tar任务生成的本地tar文件的路径。
gcp_tarfile:Google存储桶中的blob对象路径,存储为$bucket_name/$blob_name。
rundir_path:原始测序运行的目录路径。
Firestore
Firestore是可选的。如果您的配置文件包含firestore_collection设置,则将尝试写入指定的Firestore集合(如果需要则创建)。
集合中每个测序运行都有一个记录。可能的字段有
name:测序运行的名字。这反映了与类似SQLite数据库记录中相同属性的值。
storage:打包的运行目录在存储桶中的存储对象路径,形式为$bucket_name/path/to/run.tar.gz
workflow_status:工作流程的整体状态。可能的值有
new
starting
tarring
tarring_complete
uploading
uploading_complete
complete
not_running
安装和设置
这仅适用于Python 3的较新版本
pip3 install sruns-monitor
建议使用以下角色具有以下角色的服务帐户启动您的计算实例(将运行监视器)
roles/storage.objectAdmin
roles/datastore.owner
运行测试案例
每个模块都有相关的测试案例。既有单元测试也有功能测试。
单元测试
从tests包目录中运行以下命令
python3 -m unittest
有两个单元测试模块
test_sqlite_utils.py:测试sqlite_utils.Db类中的方法。这些测试确保与本地SQLite数据库交互的方法按预期工作。
test_utils.py:测试utils.py中的通用实用函数,例如打包运行目录、上传对象到Google存储以及检查子进程状态。
功能测试
运行功能测试特别有助于让您知道您的环境设置正确,并且监视器可以访问您的Firestore数据库和Google存储桶。
测试模块名为 monitor_integration_tests.py。它正在测试 sruns_monitor.Monitor 类中的逻辑。因为这个类在实例化时需要一个 JSON 格式的配置文件,所以您必须创建这样一个文件才能运行这些测试。文件必须命名为 conf.json 并位于调用目录中。以下配置参数不应指定:
watchdir
completed_runs_dir
sqlite_db
这是因为 tests 包目录中包含它自己的监视目录和模拟运行目录。您应在 conf.json 文件中提供的测试参数是:
firestore_collection
gcp_bucket_name
gcp_bucket_basedir
然后,您可以这样运行测试:
monitor_integration_tests.py
请注意,您应使用上面描述的 Google 服务帐户。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分布
构建分布
sruns-monitor-1.2.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 091560ee3ddd22bfbdce8761246cb779e599a64aae9a510bdc61d41fdaca9be5 |
|
MD5 | d4d347e9d86e55e3d78506915e64a034 |
|
BLAKE2b-256 | 4d2f3c0be688823066b8b01ee62ca57fe2e2583a6f318a4d93c14a44cc30537b |
sruns_monitor-1.2.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c8dbc70a8039af30483371dcf679e9e96124f29c77f628799a509e56c64cdc40 |
|
MD5 | a537156e5ef43d7b01802889efeb71c6 |
|
BLAKE2b-256 | d62e229f346764af81e08d8c09aa5e78fed89e8e76fc0408956709266a8667b7 |