流程管理工具(Workflow & Environment Management)¶
一句话说明¶
流程管理工具确保分析的可复现性和可维护性,是从"能跑通"到"工程化"的关键能力。面试官通过这类问题判断你是否具备工程化思维。
2. 核心知识点¶
2.1 Conda环境管理(重点)¶
基本概念¶
Conda是一个跨平台的包管理和环境管理工具,核心功能: 1. 环境隔离:不同项目可以用不同版本的软件,互不干扰 2. 依赖解析:自动处理软件包之间的依赖关系 3. 跨平台:Linux/macOS/Windows通用
核心命令¶
| 操作 | 命令 | 说明 |
|---|---|---|
| 创建环境 | conda create -n env_name python=3.9 |
指定环境名和Python版本 |
| 激活环境 | conda activate env_name |
进入环境 |
| 退出环境 | conda deactivate |
退出当前环境 |
| 安装包 | conda install -c bioconda fastqc |
从bioconda频道安装 |
| 列出环境 | conda env list |
查看所有环境 |
| 列出包 | conda list |
查看当前环境的包 |
| 导出环境 | conda env export > environment.yml |
导出环境配置 |
| 还原环境 | conda env create -f environment.yml |
从配置文件还原 |
| 删除环境 | conda env remove -n env_name |
删除整个环境 |
| 搜索包 | conda search kraken2 |
搜索可用版本 |
Channels(频道)优先级¶
# 推荐的频道配置顺序(~/.condarc)
channels:
- conda-forge # 最大的社区频道,优先级最高
- bioconda # 生信专用频道(FastQC, Kraken2, Bowtie2等)
- defaults # Anaconda官方频道
📌 面试关键点:bioconda几乎包含了所有常用生信工具,是生信人必须配置的频道。
Mamba加速¶
# Mamba 是 Conda 的 C++ 加速替代品,解析依赖快 10-50 倍
conda install -n base -c conda-forge mamba
# 用法和 conda 完全一致,只是把 conda 换成 mamba
mamba create -n metagenome python=3.9
mamba install -c bioconda kraken2 bracken bowtie2
常见问题:依赖冲突¶
# 场景:安装 A 需要 libgcc=12,但 B 需要 libgcc=11
# 解决方案1:创建独立环境(最推荐)
conda create -n tool_a -c bioconda tool_a
conda create -n tool_b -c bioconda tool_b
# 解决方案2:用 mamba 替代 conda(更快的依赖解析)
mamba install -c bioconda tool_a tool_b
# 解决方案3:指定版本
conda install tool_a=2.1 tool_b=1.3
# 最佳实践:一个分析流程一个环境,不要把所有工具装在一个环境里
environment.yml 模板¶
# environment.yml - 肠道宏基因组分析流程环境
name: metagenome_pipeline
channels:
- conda-forge
- bioconda
- defaults
dependencies:
- python=3.9
- fastqc=0.12.1
- multiqc=1.14
- fastp=0.23.4
- bowtie2=2.5.1
- kraken2=2.1.3
- bracken=2.8
- samtools=1.17
- pip:
- pandas==2.0.3
- scipy==1.11.1
- matplotlib==3.7.2
2.2 Snakemake基础(重点)¶
核心概念¶
Snakemake是一个基于Python的工作流管理系统,核心思想: - 声明式:你定义"要什么"(rule的output),Snakemake自动推断"怎么做" - DAG驱动:根据input/output依赖关系自动构建有向无环图(DAG) - 增量计算:只重跑需要更新的步骤(通过文件时间戳判断)
Rule定义¶
# Snakefile 基本结构
rule rule_name:
input:
"path/to/input_file" # 输入文件
output:
"path/to/output_file" # 输出文件
params:
extra="--threads 4" # 额外参数
threads: 4 # CPU线程数
log:
"logs/rule_name.log" # 日志文件
shell:
"""
some_command {input} {output} {params.extra} 2> {log}
"""
DAG有向无环图¶
# Snakemake 自动根据 input/output 依赖构建执行图
# 例如:
rule all → rule diversity_analysis → rule kraken2 → rule bowtie2 → rule fastp → rule fastqc
↑
原始FASTQ
📌 面试关键点:Snakemake不是按rule的书写顺序执行,而是从rule all的output反向推导整个DAG。
关键参数¶
| 参数 | 说明 |
|---|---|
--cores N / -j N |
使用N个CPU核心 |
--dryrun / -n |
预演模式(不实际执行,检查流程) |
--rerun-incomplete |
重新运行未完成的任务 |
--forceall |
强制重跑所有步骤 |
--configfile config.yaml |
指定配置文件 |
--cluster "qsub ..." |
集群投递(PBS/SLURM) |
--dag \| dot -Tpdf > dag.pdf |
可视化DAG |
2.3 Nextflow基础(了解)¶
| 概念 | 说明 |
|---|---|
| process | 类似Snakemake的rule,定义一个分析步骤 |
| channel | 数据流通道,连接process之间的输入输出 |
| workflow | 定义process的执行顺序和数据流 |
| DSL2 | Nextflow的模块化语法(推荐) |
Snakemake vs Nextflow:
| 对比项 | Snakemake | Nextflow |
|---|---|---|
| 语言基础 | Python | Groovy (JVM) |
| 学习曲线 | 较低(Python基础即可) | 较高(需学Groovy语法) |
| 社区流程 | Snakemake Workflow Catalog | nf-core(更丰富) |
| 云平台支持 | 基础 | 原生支持(AWS/GCP) |
| HPC集群 | --cluster |
原生executor |
| 推荐场景 | 个人项目、学术研究 | 生产环境、企业级 |
nf-core:一个高质量的Nextflow社区流程集合,包含100+预构建流程:
- nf-core/ampliseq —— 16S/ITS扩增子分析
- nf-core/mag —— 宏基因组组装和binning
- nf-core/taxprofiler —— 物种分类注释
- nf-core/rnaseq —— RNA-seq分析
2.4 Docker/Singularity(了解)¶
容器概念¶
| 概念 | 类比 | 说明 |
|---|---|---|
| 镜像(Image) | 安装光盘 | 只读模板,包含操作系统+软件+配置 |
| 容器(Container) | 运行中的虚拟机 | 从镜像启动的运行实例 |
| Dockerfile | 安装说明书 | 定义如何构建镜像的文本文件 |
| 仓库(Registry) | 应用商店 | Docker Hub / Biocontainers |
Docker vs Conda¶
| 对比项 | Docker | Conda |
|---|---|---|
| 隔离层级 | 操作系统级(包含OS+依赖) | 包级(共享OS) |
| 可移植性 | 极高("在我机器上能跑=在所有机器上能跑") | 一般(不同OS可能有差异) |
| 体积 | 较大(几百MB到几GB) | 较小 |
| HPC支持 | 需root权限,HPC通常不允许 | 无需root |
| 推荐 | 生产环境、云平台 | 日常开发、HPC |
Singularity在HPC上的使用¶
# HPC不允许Docker(需root权限),用Singularity替代
# Singularity可以直接使用Docker镜像
# 拉取Docker镜像转为Singularity格式
singularity pull kraken2.sif docker://staphb/kraken2:2.1.3
# 运行容器
singularity exec kraken2.sif kraken2 --version
# 绑定数据目录(让容器内能访问外部数据)
singularity exec --bind /data:/data kraken2.sif kraken2 \
--db /data/kraken2_db \
--output /data/output.txt \
/data/sample.fastq
📌 面试关键点:HPC集群通常用Singularity而非Docker,因为Docker需要root权限,存在安全隐患。
为什么生信需要容器?¶
- 环境一致性:解决"在我机器上能跑"的问题
- 版本锁定:工具版本固定,结果可复现
- 快速部署:新人入职/换机器,一条命令搭好环境
- 发表要求:越来越多期刊要求提供容器化环境
2.5 Git版本控制(重点)¶
基本概念¶
Git是分布式版本控制系统,记录代码的每一次更改,可以随时回退、分支、合并。
| 概念 | 类比 | 说明 |
|---|---|---|
| repository | 项目文件夹 | Git管理的项目 |
| commit | 存档点 | 一次代码提交 |
| branch | 平行宇宙 | 独立开发线 |
| remote | 云端备份 | GitHub/GitLab |
| staging area | 待提交清单 | add后、commit前的暂存区 |
基本操作¶
| 操作 | 命令 | 说明 |
|---|---|---|
| 初始化 | git init |
在当前目录创建Git仓库 |
| 查看状态 | git status |
查看哪些文件被修改 |
| 添加暂存 | git add file.py |
将修改加入暂存区 |
| 添加全部 | git add . |
添加所有修改 |
| 提交 | git commit -m "message" |
提交暂存区的更改 |
| 查看历史 | git log --oneline |
查看提交记录 |
| 推送 | git push origin main |
推送到远程仓库 |
| 拉取 | git pull origin main |
从远程拉取更新 |
| 创建分支 | git branch feature |
创建新分支 |
| 切换分支 | git checkout feature |
切换到指定分支 |
| 查看差异 | git diff |
查看未暂存的修改 |
.gitignore 配置(生信项目)¶
# === 大数据文件(必须忽略!) ===
*.fastq
*.fastq.gz
*.fq
*.fq.gz
*.bam
*.sam
*.sra
# === 分析结果(可重新生成) ===
results/
output/
*.html # MultiQC/FastQC报告
# === 数据库文件(太大) ===
*_db/
*.k2d
# === 临时文件 ===
*.tmp
*.log
__pycache__/
.ipynb_checkpoints/
# === 系统文件 ===
.DS_Store
Thumbs.db
# === 不忽略的(显式保留) ===
!environment.yml
!Snakefile
!scripts/*.sh
!scripts/*.py
📌 面试关键点:生信项目Git应该追踪脚本、配置文件、environment.yml,忽略原始数据、数据库、中间结果。
生信项目Git最佳实践¶
project/
├── .git/ # Git仓库(自动生成)
├── .gitignore # 忽略规则
├── README.md # 项目说明
├── environment.yml # 环境配置(必须追踪)
├── software_versions.txt # 软件版本记录
├── Snakefile # 流程文件(必须追踪)
├── config.yaml # 参数配置(必须追踪)
├── scripts/ # 分析脚本(必须追踪)
│ ├── 01_qc.sh
│ ├── 02_trim.sh
│ └── ...
├── data/ # 原始数据(.gitignore忽略)
├── results/ # 分析结果(.gitignore忽略)
└── logs/ # 运行日志(.gitignore忽略)
3. 实战命令¶
3.1 Conda环境创建和管理¶
#!/bin/bash
# conda_setup.sh - Conda环境管理全套命令
# 适用场景:从零搭建宏基因组分析环境
# === 1. 安装 Mamba(加速conda) ===
conda install -n base -c conda-forge mamba -y
# -n base: 安装到base环境
# -c conda-forge: 从conda-forge频道安装
# -y: 自动确认
# === 2. 创建分析环境 ===
mamba create -n metagenome python=3.9 -y
# -n metagenome: 环境名
# python=3.9: 指定Python版本
# === 3. 激活环境 ===
conda activate metagenome
# === 4. 安装生信工具 ===
# 质控工具
mamba install -c bioconda -c conda-forge fastqc=0.12.1 multiqc=1.14 fastp=0.23.4 -y
# 比对和物种注释
mamba install -c bioconda -c conda-forge bowtie2=2.5.1 kraken2=2.1.3 bracken=2.8 -y
# 辅助工具
mamba install -c bioconda -c conda-forge samtools=1.17 seqkit=2.5.1 -y
# Python包
pip install pandas==2.0.3 scipy==1.11.1 matplotlib==3.7.2 scikit-learn==1.3.0
# === 5. 验证安装 ===
fastqc --version # FastQC v0.12.1
fastp --version # fastp 0.23.4
bowtie2 --version # bowtie2-2.5.1
kraken2 --version # Kraken version 2.1.3
python --version # Python 3.9.x
# === 6. 导出环境配置 ===
conda env export > environment.yml
# 这个文件要加入Git追踪!
# === 7. 记录软件版本 ===
echo "=== Software Versions ===" > software_versions.txt
fastqc --version >> software_versions.txt 2>&1
fastp --version >> software_versions.txt 2>&1
bowtie2 --version 2>&1 | head -1 >> software_versions.txt
kraken2 --version >> software_versions.txt 2>&1
python --version >> software_versions.txt 2>&1
date >> software_versions.txt
echo "版本记录完成: software_versions.txt"
# === 8. 从environment.yml还原环境(换电脑时) ===
# conda env create -f environment.yml
# conda activate metagenome
# === 9. 查看已有环境 ===
conda env list
# === 10. 删除环境(不再需要时) ===
# conda env remove -n metagenome
3.2 Snakemake简单流程示例¶
# Snakefile - 宏基因组分析流程(3个rule示例)
# 流程:fastp质控 → Bowtie2去宿主 → Kraken2物种注释
# === 配置 ===
configfile: "config.yaml"
# 从config.yaml读取样本列表和参数
SAMPLES = config["samples"] # 样本名列表,如 ["sample1", "sample2"]
HOSTDB = config["host_db"] # 宿主参考基因组路径
KRAKENDB = config["kraken2_db"] # Kraken2数据库路径
# === rule all:定义最终目标文件 ===
# Snakemake从这里反向推导需要执行的所有rule
rule all:
input:
expand("results/kraken2/{sample}_report.txt", sample=SAMPLES)
# expand() 会展开为:
# results/kraken2/sample1_report.txt
# results/kraken2/sample2_report.txt
# === Rule 1: fastp 质控 ===
rule fastp_trim:
input:
r1 = "data/raw/{sample}_R1.fastq.gz", # 原始正向reads
r2 = "data/raw/{sample}_R2.fastq.gz" # 原始反向reads
output:
r1 = "results/clean/{sample}_clean_R1.fastq.gz", # 质控后正向
r2 = "results/clean/{sample}_clean_R2.fastq.gz", # 质控后反向
html = "results/qc/{sample}_fastp.html", # 质控报告
json = "results/qc/{sample}_fastp.json"
threads: 4 # 使用4个线程
log:
"logs/fastp/{sample}.log" # 日志文件
shell:
"""
fastp \
-i {input.r1} -I {input.r2} \
-o {output.r1} -O {output.r2} \
--html {output.html} --json {output.json} \
--qualified_quality_phred 20 \
--length_required 50 \
--thread {threads} \
2> {log}
"""
# === Rule 2: Bowtie2 去宿主 ===
rule bowtie2_remove_host:
input:
r1 = "results/clean/{sample}_clean_R1.fastq.gz",
r2 = "results/clean/{sample}_clean_R2.fastq.gz"
output:
r1 = "results/host_removed/{sample}_nohost_R1.fastq.gz",
r2 = "results/host_removed/{sample}_nohost_R2.fastq.gz"
params:
host_db = HOSTDB # 宿主基因组索引
threads: 8
log:
"logs/bowtie2/{sample}.log"
shell:
"""
bowtie2 -x {params.host_db} \
-1 {input.r1} -2 {input.r2} \
--very-sensitive \
--threads {threads} \
--un-conc-gz results/host_removed/{wildcards.sample}_nohost_R%.fastq.gz \
-S /dev/null \
2> {log}
"""
# --un-conc-gz: 输出未比对上宿主的reads(即非宿主reads)
# -S /dev/null: 不保存SAM文件(我们只要未比对的reads)
# === Rule 3: Kraken2 物种注释 ===
rule kraken2_classify:
input:
r1 = "results/host_removed/{sample}_nohost_R1.fastq.gz",
r2 = "results/host_removed/{sample}_nohost_R2.fastq.gz"
output:
report = "results/kraken2/{sample}_report.txt", # 分类报告
output = "results/kraken2/{sample}_output.txt" # 详细输出
params:
db = KRAKENDB
threads: 8
log:
"logs/kraken2/{sample}.log"
shell:
"""
kraken2 --db {params.db} \
--paired {input.r1} {input.r2} \
--threads {threads} \
--report {output.report} \
--output {output.output} \
--confidence 0.2 \
2> {log}
"""
配套的config.yaml:
# config.yaml - Snakemake配置文件
samples:
- sample1
- sample2
- sample3
host_db: "/data/db/bowtie2/human_genome"
kraken2_db: "/data/db/kraken2/standard_db"
运行命令:
# 预演模式(不实际执行,检查流程是否正确)
snakemake -n -j 8
# 正式运行(使用8个核心)
snakemake -j 8
# 可视化DAG
snakemake --dag | dot -Tpdf > dag.pdf
# 断点续跑(之前中断的任务重新运行)
snakemake -j 8 --rerun-incomplete
# 集群投递(SLURM为例)
snakemake -j 100 --cluster "sbatch -p normal -n {threads} -o {log}"
3.3 Git基本工作流¶
#!/bin/bash
# git_workflow.sh - 生信项目Git工作流
# 从创建仓库到日常提交的完整流程
# === 1. 初始化仓库 ===
cd ~/projects/metagenome_pipeline # 进入项目目录
git init # 初始化Git仓库
# 输出: Initialized empty Git repository
# === 2. 创建 .gitignore ===
cat > .gitignore << 'EOF'
# 大数据文件
*.fastq
*.fastq.gz
*.bam
*.sam
data/
# 分析结果(可重新生成)
results/
output/
# 数据库
*_db/
# 临时文件
*.tmp
*.log
__pycache__/
.ipynb_checkpoints/
EOF
# === 3. 首次提交 ===
git add .gitignore
git add environment.yml
git add software_versions.txt
git add Snakefile
git add config.yaml
git add scripts/
# 注意:不要 git add . 因为可能会把大文件加进去
# 只添加需要追踪的文件
git commit -m "feat: 初始化宏基因组分析流程
- 添加 environment.yml 环境配置
- 添加 Snakefile 流程定义
- 添加分析脚本 (scripts/)
- 配置 .gitignore 忽略数据文件"
# === 4. 连接远程仓库(GitHub) ===
git remote add origin https://github.com/username/metagenome_pipeline.git
git branch -M main # 重命名默认分支为main
git push -u origin main # 首次推送(-u 设置上游分支)
# === 5. 日常工作流 ===
# 修改了脚本后:
git status # 查看修改了哪些文件
git diff scripts/03_kraken2.sh # 查看具体修改内容
git add scripts/03_kraken2.sh # 添加修改的文件
git commit -m "fix: 修复Kraken2 confidence参数" # 提交
git push # 推送到远程
# === 6. 查看历史 ===
git log --oneline -10 # 查看最近10条提交记录
# 输出示例:
# a1b2c3d fix: 修复Kraken2 confidence参数
# e4f5g6h feat: 添加Shannon多样性分析脚本
# i7j8k9l feat: 初始化宏基因组分析流程
# === 7. 分支管理(添加新功能时) ===
git checkout -b feature/diversity # 创建并切换到新分支
# ... 在新分支上开发 ...
git add scripts/diversity.py
git commit -m "feat: 添加多样性分析模块"
git checkout main # 切回主分支
git merge feature/diversity # 合并新功能
git branch -d feature/diversity # 删除已合并的分支
3.4 environment.yml 模板¶
# ============================================================
# environment.yml - 肠道宏基因组分析流程环境配置
# Gut Metagenome Analysis Pipeline Environment
# ============================================================
#
# 使用方法:
# 创建环境: conda env create -f environment.yml
# 激活环境: conda activate metagenome_pipeline
# 更新环境: conda env update -f environment.yml
# 导出环境: conda env export > environment.yml
#
# 作者: 彭文强
# 日期: 2026-04
# ============================================================
name: metagenome_pipeline
channels:
- conda-forge # 社区维护频道(优先级最高)
- bioconda # 生信工具专用频道
- defaults # Anaconda官方频道
dependencies:
# --- Python ---
- python=3.9.18
# --- 质控工具 ---
- fastqc=0.12.1 # reads质量评估
- multiqc=1.14 # 汇总多个QC报告
- fastp=0.23.4 # reads清洗和过滤
# --- 比对工具 ---
- bowtie2=2.5.1 # 短reads比对(去宿主)
- samtools=1.17 # SAM/BAM文件处理
# --- 物种注释 ---
- kraken2=2.1.3 # k-mer物种分类
- bracken=2.8 # Kraken2丰度估计校正
# --- 辅助工具 ---
- seqkit=2.5.1 # FASTA/FASTQ瑞士军刀
- csvtk=0.27.2 # CSV/TSV处理
# --- 流程管理 ---
- snakemake-minimal=7.32.4 # 工作流管理
# --- Python包(pip安装) ---
- pip:
- pandas==2.0.3 # 数据分析
- scipy==1.11.1 # 科学计算
- matplotlib==3.7.2 # 基础绘图
- scikit-learn==1.3.0 # 机器学习
- scikit-bio==0.5.9 # 生态多样性计算
4. 面试常问点¶
★ 你怎么管理分析环境?conda怎么用?¶
参考答案:我用Conda管理分析环境,具体做法是: 1. 一个项目一个环境:比如宏基因组分析用
metagenome环境,16S分析用amplicon环境,避免依赖冲突 2. 创建环境:conda create -n metagenome python=3.9,然后从bioconda频道安装生信工具 3. 导出环境:完成后用conda env export > environment.yml锁定所有软件版本 4. 加速安装:用Mamba替代Conda,解析依赖快10-50倍💡 加分回答:在我的肠道宏基因组项目中,我配套了
environment.yml和software_versions.txt,保证换一台机器也能用conda env create -f environment.yml一条命令还原整个分析环境。
★ 如何保证分析流程可复现?¶
参考答案:我从三个层面保证可复现性: 1. 环境锁定:
environment.yml记录所有软件及其版本号 2. 流程脚本化:所有分析步骤写成Shell脚本或Snakemake流程,不手动执行命令 3. 版本记录:software_versions.txt记录每个工具的版本,脚本加set -euo pipefail错误处理💡 加分回答:在我的个人项目中,我的15个分析脚本都有编号和中文注释,配合environment.yml和运行日志,一键
bash run_all.sh就能从FASTQ复现到最终结果。同时用Git追踪脚本的修改历史。
★ Snakemake的优势是什么?和直接写Shell脚本比?¶
参考答案:
对比项 Shell脚本 Snakemake 断点续跑 需要手动处理 自动(通过文件时间戳判断) 并行执行 需要手动 &和wait自动(通过DAG调度) 依赖管理 靠脚本顺序 显式声明(input/output) 集群投递 需要写投递脚本 一个 --cluster参数搞定扩展性 加样本要改脚本 expand()自动扩展💡 加分回答:在实习中,我主要用Shell脚本批处理(因为百迈客有现成流程),但在个人项目中我了解了Snakemake,它的DAG驱动特别适合宏基因组这种多步骤、多样本的流程。如果中途某个样本的一步失败了,只需要
snakemake --rerun-incomplete就能从断点继续。
★ Docker和Conda的区别?¶
参考答案: - Conda是包级别的隔离:不同环境有不同版本的软件,但共享操作系统 - Docker是操作系统级别的隔离:打包了整个运行环境(OS+依赖+软件),完全独立
打比方:Conda像是在同一个房子里隔出不同的房间,Docker像是给你一整栋独立的房子。
选择建议: - 日常开发和HPC集群用Conda(轻量、无需root) - 生产环境和发表用Docker/Singularity(完全可复现) - HPC上用Singularity代替Docker(不需要root权限)
★ 你用Git做什么?¶
参考答案:在我的个人项目中,我用Git做三件事: 1. 版本追踪:跟踪分析脚本、Snakefile、environment.yml的修改历史 2. 备份:推送到GitHub作为远程备份 3. 可复现:别人clone我的仓库,按README步骤就能复现分析
我的.gitignore配置了忽略大数据文件(.fastq.gz)和分析结果(results/),只追踪脚本和配置文件。
★ environment.yml包含什么内容?¶
参考答案:environment.yml是Conda环境的配置文件,包含四个部分: 1. name:环境名称(如
metagenome_pipeline) 2. channels:软件来源频道(conda-forge, bioconda, defaults) 3. dependencies:所有安装的包及其精确版本号(如kraken2=2.1.3) 4. pip子项:通过pip安装的Python包(如pandas==2.0.3)用
conda env export > environment.yml导出,用conda env create -f environment.yml还原。⚠️ 注意:建议手动编辑yml,只保留直接安装的包,去掉自动依赖,这样跨平台还原时不容易出冲突。
5. 易错/易混淆点¶
⚠️ conda activate vs source activate¶
# 新版Conda(4.6+)推荐用:
conda activate metagenome # 推荐
# 旧版用法(可能在老服务器上遇到):
source activate metagenome # 旧版
# 如果 conda activate 报错:
# CommandNotFoundError: Your shell has not been properly configured
# 需要先运行:
conda init bash
# 然后重启终端
⚠️ Snakemake的rule all作用¶
# rule all 不执行任何命令
# 它的作用是定义最终目标文件(告诉Snakemake"我要什么")
# 正确理解:
rule all:
input:
expand("results/{sample}_report.txt", sample=SAMPLES)
# Snakemake从这些目标文件反向推导需要执行哪些rule
# 常见错误:以为rule all会执行第一个
# 实际上:Snakemake是从output到input反向推导的
⚠️ Docker vs Singularity在HPC上的限制¶
Docker:
- 需要 root 权限(普通用户无法运行)
- 存在安全隐患(root权限可能影响整个集群)
- HPC管理员通常禁用Docker
Singularity:
- 不需要 root 权限(普通用户可直接使用)
- 可以直接使用 Docker 镜像(singularity pull docker://...)
- HPC集群的标准选择
结论:HPC上用Singularity,本地开发可以用Docker
⚠️ Git的.gitignore应该忽略什么¶
必须忽略(文件太大):
✗ 原始数据:*.fastq.gz, *.bam, *.sam
✗ 数据库文件:*_db/, *.k2d
✗ 分析结果:results/, output/
必须追踪(核心资产):
✓ 分析脚本:scripts/*.sh, scripts/*.py
✓ 流程文件:Snakefile, *.smk
✓ 环境配置:environment.yml
✓ 项目配置:config.yaml
✓ 版本记录:software_versions.txt
✓ 说明文档:README.md
常见错误:
✗ 把.fastq.gz加入Git → 仓库膨胀到几十GB
✗ 忘记追踪environment.yml → 环境不可复现
⚠️ Snakemake通配符 wildcards 理解¶
# {sample} 是通配符,Snakemake自动匹配
rule fastp:
input:
"data/{sample}_R1.fastq.gz" # {sample} = sample1, sample2, ...
output:
"results/{sample}_clean.fastq.gz"
# 常见错误:在shell命令中直接写 {sample}
# 正确:用 {wildcards.sample}(在shell块中)或 {input}/{output}(引用文件)
shell:
"fastp -i {input} -o {output}" # 正确
# "fastp -i data/{sample}_R1.fastq.gz" # 错误!shell中需要 {wildcards.sample}
6. 快速复习卡片¶
| 问题 | 一句话答案 |
|---|---|
| Conda创建环境 | conda create -n name python=3.9 |
| Conda导出环境 | conda env export > environment.yml |
| Conda还原环境 | conda env create -f environment.yml |
| Mamba是什么 | Conda的C++加速替代品,解析依赖快10-50倍 |
| bioconda是什么 | 生信专用的Conda频道,包含几乎所有生信工具 |
| Snakemake核心 | 声明式、DAG驱动、增量计算 |
| rule all作用 | 定义最终目标文件,驱动反向推导 |
| Snakemake断点续跑 | snakemake --rerun-incomplete |
| Docker vs Conda | Docker=OS级隔离,Conda=包级隔离 |
| HPC用什么容器 | Singularity(不需要root权限) |
| Git追踪什么 | 脚本、配置文件、environment.yml |
| Git忽略什么 | 原始数据、数据库、分析结果 |
| nf-core是什么 | Nextflow社区预构建流程集合(100+流程) |
| 可复现三要素 | environment.yml + 脚本化流程 + 版本记录 |
版本动态提示¶
面试前建议自行确认工具最新版本(
conda search 工具名或查看官方 GitHub),以下为编写时参考:
| 工具 | 参考版本 | 趋势 |
|---|---|---|
| Snakemake | v8+ | v8 起引入插件化架构(存储/执行器可插件化),面试可提及 |
| Conda/Mamba | mamba 持续主流 | bioconda/conda-forge 双频道仍是生信标配 |
| QIIME2 | 持续更新 | 面试前查官网确认最新版本号 |
面试加分话术: - "Snakemake 新版引入了插件化架构,执行后端、存储后端都可以通过插件扩展,比早期版本更灵活" - "我日常用 mamba 替代 conda,依赖解析速度快 10-50 倍,特别是安装复杂的生信工具组合时效果很明显"