核心概念:对象、项目与引用
在深入命令之前,理解DNAnexus的核心数据模型至关重要。这不是可选的理论课——如果你不理解这三个概念,每一条dx命令都会让你困惑。
1. 对象(Object)——平台上的所有实体都是对象。每个对象有一个唯一不可变的ID,格式为类型-xxxx:
project-xxxx——项目file-xxxx——文件job-xxxx——作业applet-xxxx——应用record-xxxx——记录
2. 项目(Project)——权限边界和数据组织单元。所有操作都在某个项目上下文中进行。项目之间通过ID可以实现跨项目访问。
3. 引用(Reference)——通过对象ID而非路径引用数据,确保不可变性和可重复性。
对象引用语法
DNAnexus有三种引用方式,理解它们的区别是构建自动化脚本的基础:
第一种用于直接访问已知路径的文件。第二种是自动化的关键——你可以引用一个尚未完成的作业的输出,系统会自动建立依赖关系。第三种在编写dx-app或直接调用API时使用。
不可变性原则
DNAnexus上的数据对象是不可变的(immutable)——它们只能被创建或删除,不能被覆盖。同一个项目里上传两个同名文件不会覆盖,而是创建两个独立对象各有独立ID。这不是bug,是设计:不可变性保证了分析的可重复性——同一个对象ID永远指向同一组字节。
安装与身份认证
安装dx-toolkit
dx CLI是dx-toolkit的一部分。安装方式取决于你的环境:
登录与会话管理
令牌管理:在DNAnexus平台UI中生成认证令牌(Settings → API Keys),而非在脚本中硬编码用户名密码。令牌可以设置过期时间和权限范围。
自动化场景:使用DX_SECURITY_CONTEXT环境变量传递令牌,避免在命令行参数中暴露:
多账号切换:使用--env-help查看可覆盖的环境变量,在不同项目/账号间切换。
项目导航与数据探查
选择项目
登录后需要选择一个工作项目——这是所有后续操作的上下文。dx select是切换工作空间的核心命令:
目录操作
使用通配符(*或?)时必须用引号包裹。否则Shell会在传递给dx之前先行展开,导致意外结果或"file not found"错误。
正确:dx ls "*.fastq"
错误:dx ls *.fastq(Shell会先在本地目录展开)
跨项目访问
你不需要切换项目就能查看其他项目的内容——使用项目ID:路径语法即可:
文件操作:cp、mv、rm
使用dx cp在同一区域的两个项目间复制文件时,平台不会物理复制数据——它只创建一个新的数据库条目指向同一组字节。这意味着不产生额外存储费用。跨区域复制则会物理拷贝数据并产生费用。
使用dx describe <project-id>查看项目的"Region"属性确认区域。
数据上传与下载
上传
下载
快速查看文件内容
对于大规模文件传输(GB级或批量文件),建议使用Upload Agent(UA)而非dx upload。UA支持:
- 多线程并行上传
- 自动压缩
- 断点续传
- 批量文件传输
传输效率比基础dx upload提升数倍。详见DNAnexus官方文档的Upload Agent章节。
对象元数据:describe与find
dx describe——查看对象详情
dx describe是理解任何对象属性的关键命令。它返回对象的完整元数据:
dx find——搜索平台实体
dx find是一个强大的搜索命令,可以搜索多种实体类型:
| 元数据类型 | 用途 | 设置方式 |
|---|---|---|
| Properties | 键值对形式的实验元数据(物种、样本ID、批次) | dx set_properties file-xxxx species=human |
| Tags | 快速筛选和分类对象 | dx tag file-xxxx processed |
| State | closed=上传完成,open=正在写入 | 上传完成后自动变为closed |
作业管理:run、watch、wait
DX CLI的核心价值在于程序化地执行分析作业。理解作业的生命周期是管理复杂分析流的基础。
dx run——启动作业
输入参数前缀取决于参数类型:
-i——普通输入(文件、字符串、数字)-is——字符串类型输入-ia——数组类型输入-ib——布尔类型输入
使用dx run <app> -h查看某个应用的完整参数列表。方括号[]表示可选参数。
关键标志:
-y / --yes——跳过确认提示,适合脚本--brief——只返回作业ID--watch——启动后立即监控日志--allow-ssh——允许SSH进入作业节点
作业生命周期管理
| 命令 | 功能 | 典型场景 |
|---|---|---|
dx run |
启动作业/应用 | 执行BWA比对、变异检测 |
dx watch |
实时跟踪日志 | 监控长作业进度,查看STDERR |
dx describe job-xxxx |
查看作业详情 | 检查状态、输入输出、耗时 |
dx find jobs |
检索作业历史 | 审计分析流程,查找失败作业 |
dx terminate |
终止运行中作业 | 取消错误配置的作业以节省成本 |
dx wait |
等待作业完成 | 串联依赖作业,实现自动化 |
作业状态流转
链式引用:构建自动化流水线
DNAnexus最强大的特性是作业链式引用(Job-based Object Reference)。通过job-ID:output_field语法,可以将上游作业的输出直接作为下游作业的输入——无需等待中间文件落地。系统自动处理依赖关系,确保下游作业在上游完成后才启动。
流水线执行逻辑
上传FASTQ → BWA比对 → FreeBayes变异检测 → 下载VCF结果
完整自动化脚本示例
以下是一个完整的端到端自动化流水线脚本——从上传FASTQ到下载VCF,全程无需人工干预:
1. 自动依赖管理:系统自动建立作业依赖图。FreeBayes作业在BWA完成前处于"waiting for input"状态——不消耗计算资源。
2. 无中间文件落地:BWA的输出BAM文件不需要下载到本地再上传给FreeBayes。数据在云端直接传递,节省时间和带宽。
3. 可重复性:由于对象不可变,同样的输入+同样的应用=同样的输出。DNAnexus甚至支持smart reuse——如果你再次运行相同的作业,系统会直接返回之前的结果而不重新计算。
4. 错误隔离:如果BWA失败,FreeBayes作业会自动标记为terminated,不会浪费计算资源。
进阶:多分支流水线
完整命令速查表
| 分类 | 命令 | 功能 |
|---|---|---|
| 认证 | dx login |
登录平台 |
dx logout |
登出(令牌失效) | |
dx whoami |
查看当前用户 | |
dx env |
查看当前环境配置 | |
| 项目 | dx select |
选择/切换项目 |
dx new project |
创建新项目 | |
dx invite |
邀请用户加入项目 | |
dx uninvite |
撤销用户访问权限 | |
dx pwd |
查看当前工作目录 | |
| 数据 | dx ls |
列出目录内容 |
dx cd |
切换目录 | |
dx mkdir |
创建目录 | |
dx cp |
跨项目复制 | |
dx mv |
移动/重命名 | |
dx rm / dx rmdir |
删除文件/目录 | |
dx tree |
树状显示结构 | |
| 传输 | dx upload |
上传文件 |
dx download |
下载文件 | |
dx head |
查看文件头部 | |
dx cat |
输出文件内容 | |
| 元数据 | dx describe |
查看对象详情 |
dx find data/jobs/apps |
搜索实体 | |
dx tag / dx set_properties |
设置标签/属性 | |
| 作业 | dx run |
启动作业 |
dx watch |
实时监控日志 | |
dx wait |
等待作业完成 | |
dx terminate |
终止作业 | |
dx install |
安装/收藏应用 |
最佳实践与常见陷阱
1. 永远用ID引用对象
文件名在项目中不唯一——两个同名文件可以共存。使用file-xxxx而非文件名来引用对象,确保操作的是正确的对象。
2. 脚本中始终使用--brief和-y
--brief只返回对象ID,方便管道传递。-y跳过确认提示,避免脚本卡在交互等待。
3. 通配符必须加引号
dx ls "*.fastq"而非dx ls *.fastq。否则Shell会先在本地展开。
4. 利用链式引用而非顺序等待
不要dx wait $BWA_JOB后再启动下游——直接用$BWA_JOB:output作为下游输入,让系统自动管理依赖。
5. 用Properties和Tags组织数据
上传时设置--property和--tag,后续可以用dx find data --property/--tag快速筛选,比目录结构更灵活。
6. 大文件用Upload Agent
dx upload适合小文件。GB级文件使用Upload Agent(UA),支持多线程和断点续传。
7. 及时终止错误作业
发现配置错误的作业立即dx terminate——运行中的作业按时间计费,浪费计算资源就是浪费经费。
8. 使用set -euo pipefail保护脚本
在自动化脚本中使用bash严格模式,任何命令失败都会立即停止脚本,避免错误传播。
| 陷阱 | 后果 | 解决方案 |
|---|---|---|
| 通配符不加引号 | Shell本地展开,dx收到错误参数 | 始终用引号:"*.fastq" |
| 用文件名删除文件 | 同名文件多个时,提示选择 | 用file-ID删除 |
在脚本中不加-y |
脚本卡在确认提示 | 始终加-y --brief |
同项目内dx cp |
报错——同项目内不能复制 | 用dx mv移动,或重新上传 |
上传到/data以为是目录 |
如果/data不存在,创建文件而非目录 |
先dx mkdir data,上传时用--path /data/(注意尾斜杠) |
忘记dx select切换项目 |
操作在了错误的项目上 | 脚本开头始终dx select PROJECT_ID |
参考资源
官方文档:
- DNAnexus CLI Quickstart——官方命令行快速入门教程
- Index of dx Commands——所有dx命令的完整帮助字符串
- DNAnexus Academy CLI课程——从入门到进阶的CLI教程
- Project Navigation文档——项目导航与数据管理详解
工具版本:
- dx-toolkit v0.394.0, API v1.0.0
- Python 3 required
- 安装:
pip install dxpy
快速帮助:
dx help——按分类列出所有命令dx help <category>——查看某类命令dx help <command>或dx <command> -h——查看具体命令用法
一句话总结:DX CLI的设计哲学是"一切皆对象、引用而非复制、声明式依赖管理"。通过对象ID的不可变引用确保分析可重复性,通过作业链式引用构建声明式流水线,通过细粒度权限控制实现安全协作。掌握这些底层逻辑后,从数据上传到全流程自动化分析,一条命令行就够了。