用于管理从 DNAnexus 下载大量文件的 CLI 工具
注意:这是该工具的早期版本,正在各种设置中进行测试。 如果您有兴趣了解此工具是否适合您的应用,请联系 DNAnexus。
要开始使用dx-download-agent
,请从发布页面下载最新的预编译二进制文件。 下载代理接受两个文件:
manifest_file
:BZ2 压缩的 JSON 清单文件,至少描述以下下载信息,例如:
{“项目-AAAA”:[ {“id”:“文件-XXXX”,“名称”:“foo”,“文件夹”:“/路径/到”,“零件”:{“1”:{“大小”:10,“md5”: “49302323”},“2”:{“大小”:5,“md5”:“39239329”} } }, “...” ], "项目-BBBB": [ "..." ] }
要开始下载过程,首先生成一个 DNAnexus API 令牌,该令牌在您计划下载文件的时间段内有效。 将其存储在以下环境变量中:
导出 DX_API_TOKEN=<在此处插入 API 令牌>
如果未提供 API 令牌,下载代理将查找 dx-toolkit 也使用的~/.dnanexus_config/environment.json
。
开始下载:
dx-download-agent download exome_bams_manifest.json.bz2 Obtained token using environment Creating manifest database manifest.json.bz2.stats.db Required disk space = 1.2TB, available = 3.6TB Logging detailed output to: manifest.json.bz2.download.log Preparing files for download Downloading files using 8 threads Downloaded 11904/1098469 MB 124/11465 Parts (104.0 MB written to disk in the last 60s)
有关下载进度的连续报告将写入屏幕。在开始数据传输之前,会检查是否有足够的磁盘空间容纳整个文件列表。如果没有,则会报告错误,并且不会下载任何内容。下载速度不仅反映网络带宽,还反映您机器的IO能力。
下载日志包含发生错误时有关下载的更多详细信息。 如果确实发生错误并且您不知道如何处理它,请联系[email protected]
并附上日志文件,我们将为您提供帮助。
请注意,重新运行dx-download-agent download
命令不会重新下载任何先前下载的文件,这些文件随后被移动、删除或修改。 请运行dx-download-agent inspect
(如下所述)以检测先前下载的文件的任何更改并将其标记为重新下载。 有关更多详细信息,请参阅移动下载的文件。
您可以在单独的终端中查询现有下载的进度
dx-download-agent progress exome_bams_manifest.json.bz2
您将获得下载状态的简要摘要:
21.6 MB/sec 1184/27078 MB 18/327 Parts Downloaded and written to disk
要检查下载文件的完整性,您可以运行
dx-download-agent inspect exome_bams_manifest.json.bz2
此命令将对文件执行检查并确保其 MD5 和与清单匹配。如果文件丢失或 MD5sum 不匹配,下载代理将报告受影响的文件,然后您可以再次运行dx-download-agent download
来重新下载受影响的文件。
-num_threads
(整数):下载或检查文件时使用的最大并发线程数
例如,命令
dx-download-agent download -num_threads=20 exome_bams_manifest.json.bz2
将创建一个包含 20 个线程的工作池,这些线程将并行下载部分文件。 任何时候最多有 20 个工作人员执行下载。 通过改变这个数字可以在一定程度上控制下载的速率限制。
有关已下载哪些部分的信息维护在 sqlite3 数据库文件中,该文件包含与 JSON 文件格式中的内容类似的信息以及附加的bytes_fetched
字段。
表名称: manifest_stats
字段(除非另有说明,所有字段均为字符串)
file_id
:文件部分的文件 ID
project
:文件部分的项目 ID
name
:文件名
folder
: 包含 DNAnexus 上文件的文件夹
part_id
(整数):文件的部分 ID
md5
:零件 ID 的 md5sum
size
(整数):零件的尺寸
block_size
(整数):文件的主块大小(假定等于除最后一部分之外的size
)
bytes_fetched
(integer <= size
): 下载的总字节数
由实现来决定是否以更粗粒度或更细粒度的方式更新bytes_fetched
。 例如,只有当部分下载完成时,才能更新bytes_fetched
。在这种情况下,它的值将仅为0
或size
的值。
该清单包含每个文件的四个字段: file_id
、 project
、 name
和parts
。如果指定了所有四个文件,则假定该文件处于活动状态并已关闭,可供下载。如果省略parts
字段,则该文件将在平台上进行描述。批量描述用于高效地批量处理许多文件。已存档或未关闭的文件无法下载,并且会触发错误。
可以下载 DNAx 符号链接,该链接没有部件。符号链接的必填字段为file_id
、 project
和name
。请注意,符号链接具有全局 MD5 校验和,在下载结束时进行检查。
除了独立的 Go 二进制文件之外,我们还提供 Docker 化版本。它的使用方式与独立可执行文件非常相似,但需要挂载本地文件夹并提供 DX API 令牌。
目前,我们提供以下图像标签:
latest
- master 分支的最新版本
0.5.11
, 0.5.12
, ... - 每个版本的专用标签(从 0.5.11 开始)
- 主分支上每次提交的开发构建
用法示例:
$ docker run -v $PWD:/workdir -w /workdir -e DX_API_TOKEN=$DX_API_TOKEN dnanexus/dxda:latest download -max_threads=20 manifest.json.bz2
在哪里:
$PWD
是计算机上下载文件的目录路径
DX_API_TOKEN
是访问我们平台的令牌(请参阅快速入门)
要将dx-download-agent
定向到代理,请将HTTP_PROXY
环境变量设置为类似export HTTP_PROXY=hostname:port
。还支持HTTPS_PROXY
。
默认情况下, dx-download-agent
使用系统上安装的证书来创建安全连接。 如果您的系统需要额外的 TLS 证书,并且dx-download-agent
似乎没有使用您系统上安装的证书,则有两个选项(按优先顺序排列)。 首先,将DX_TLS_CERTIFICATE_FILE
环境变量设置为父组织所需的 PEM 编码的 TLS 证书文件的路径。作为最后的手段,您可以通过设置DX_TLS_SKIP_VERIFY=true
来避免证书验证,从而进行不安全的连接。仅将此用于测试目的。
为方便起见, scripts/
目录中的create_manifest.py
文件是为下载代理创建清单文件的一种方法。 此脚本要求您的系统上安装 dx-toolkit 并且您登录到 DNAnexus 平台。 如何使用它的示例:
python3 create_manifest.py“项目:/文件夹”--recursive--output_file“myfiles.manifest.json.bz2”
此处,将递归地为项目名称Project
下和文件夹Folder
中的所有文件创建清单。
随后可以使用filter_manifest.py
脚本过滤清单。 例如,如果您想捕获特定文件夹(例如Folder
)中包含testcall
(例如/Folder/ALL.chr22._testcall_20190222.genotypes.vcf.gz
),您可以运行以下命令:
$ python3 filter_manifest.py manifest.json.bz2 '^/Folder.*testcall.*'
其中给脚本的第二个参数是整个路径(文件夹+文件名)的正则表达式。
在某些情况下,可能需要将下载清单拆分为多个清单文件以用于测试目的或管理跨不同环境的整个数据集的多次下载。 为了分割文件,我们提供了一个简单的Python实用程序,不需要在scripts/
目录中添加额外的包。 例如,执行命令:
python3 scripts/split_manifest.py manifest.json.bz2 -n 100
将创建清单文件,其中每个项目包含 100 个文件。 例如,如果 manifest.json.bz2 中总共有 300 个文件,则此命令的输出将创建三个文件,名为: manifest_001.json.bz2
、 manifest_002.json.bz2
和manifest_003.json.bz2
。 这些文件中的每一个都可以与下载代理一起独立使用。
该存储库也可以直接用作 Go 模块。 在cmd/dx-download-agent
目录中, dx-download-agent.go
文件是如何使用它的示例。
对于在隔离的 Docker 环境中开发和试验源代码,此存储库中的 Dockerfile 可能是一个好的开始。
成功下载(并可选择检查下载后)后,应该可以安全地将文件移动到您所需的位置。
警告:一般来说,我们建议不要在下载过程中移动文件,但在某些特殊情况下移动文件可能是安全的。下载代理的工作原理是维护一个轻量级数据库,其中包含文件的哪些部分已下载和尚未下载,这就是它主要运作于。 这意味着,即使您移动文件,下载代理也不会意识到这一点,直到您运行inspect
子命令来执行下载后检查磁盘上的文件完整性。检查命令将注意到文件丢失,更新数据库,并且当您重新发出下载命令时尝试再次下载它们。 因此,如果您移动已完成的文件并且不运行检查子命令,下载代理应从中断处继续。 话虽如此,如果文件下载尚未完成,则移动文件存在危险。 在这种情况下,您将移动不完整的文件。
只能下载 File 类的对象。