Achelous 数据访问
为何分布式计算环境的路径与Linux 单机不同?
与Linux 单机环境不同,分布式计算集群一般将存储资源放在单独网络位置,以便全部计算节点能够访问。
另一方面,对于生物信息分析流程而言,一套通用性较强的流程,必然意味着程序本身与数据的分离。尤其对于存储挂载出现变化的情况下,通过唯一的位置引用文件尤为必要。
Achelous 存储访问模式
Achelous 中对存储上文件的访问,遵循卷名+挂载位置:文件相对位置的规则。例如在上述情况中,存储的挂载的卷名为 xtao@alamo: 则,hello_world.txt 文件在集群中的绝对位置为: xtao@alamo:hello_world.txt
通过Achelous 提交作业的过程中,文件(或目录)推荐采用这种方式进行访问。 当存储挂载位置一致的集群环境,用户也可以采用Linux 路径方式进行访问
如何在WDL 脚本中访问存储资源
用户在运行WDL 任务时,Task 运行时需要访问存储数据,因此需要将存储卷映射到Docker 容器,WDL的Task 中的command 区域内的脚本访问文件的路径也需要使用相对于容器的路径。这些操作严重依赖运行环境,非常繁琐,易出错。Bioflow 可以自动为用户完成这些工作,它提供了三种工作模式。
1. Achelous 自动挂载
用户在编写WDL 脚本的时候,使用File 类型的变量来访问文件。文件的路径用极道的统一路径表示:volume@cluster:/path。例如:
### in WDL script ###
File a = "vol1@cluster1:/a/b/c"
或者
### in WDL script ###
String x = "vol1@cluster1:/a/b/c"
File a = x
如果在Task 的command 部分中使用File 变量a,例如:
task foo {
## wdl code ##
command {
cat ${a} > output.txt
}
}
当Task 的call 作为docker 容器执行的时候,Achelous 将自动为容器挂载文件变量a 所在的卷,并将${a}转换为容器内a 文件所对应的路径。多个File 变量、Array[File]等都可以自动处理。所以在这种使用方式下,用户不需要做任何操作,程序像运行在本地一样运行在服务器上。
2.使用Volume 的runtime 属性映射
Achelous 支持用户在task
的runtime
属性映射主机的路径到容器中,类似于docker run –v
参数的作用。
注意
以下情况下WDL 解析器不具备自动映射功能,用户必须通过runtime 映射才能实现文件操作
- 脚本中存在路径引用
例如shell 脚本demo.sh如下:
sort /opt/my_data_in_local/sample_names.txt
此处/opt/my_data_in_local 为Linux 主机内路径,在Docker 容器内不存在对应路径,为了保证该路径能正常执行,需要对该路径进行手动挂载。
task foo {
command{
sh demo.sh
}
runtime{
volumes : {
"/opt/my_data_in_local":"/opt/my_data_in_local" ## 挂载到同一目录
}
}
}
- 引用文件中存在路径
如file.list 中,内容如下:
/mnt/data_local/sample1.bam
/mnt/data_local/sample2.bam
/mnt/data_local/sample3.bam
用户如果没有自动挂载,则在使用时进行手动挂载,以进行映射:
task foo {
command{
sh dosomething.sh file.list
}
runtime{
volumes : {
"/mnt/data_local":"/mnt/data_local" ## 挂载到同一目录
}
}
}
3. 使用绝对路径
用户也可以根据自身习惯,在流程或参数文件中使用文件的绝对路径。例如:
### in WDL script ###
File a = "/a/b/c"
注意
此处文件需在外部存储的相应位置。