2. 数据库下载失败:那些年我踩过的坑
数据库下载是整个Kraken2流程的第一步,也是最容易出问题的一步。你可能遇到过:跑到一半卡住了,或者压根连不上,再或者磁盘满了报错。说实话,我最早接触Kraken2时,光下载数据库就折腾了整整一个下午。今天就掰开揉碎聊一聊这几种常见错误,以及怎么对付它们。
2.1 网络连接超时
这恐怕是出现频次最高的错误了。Kraken2的数据库文件动辄几十GB,从海外服务器下载,一旦网络不稳定,分分钟报超时。
| 错误表现 | 典型日志片段 |
|---|---|
| 下载中途卡住,最终失败 | curl: (28) Connection timed out after 30000 milliseconds |
| wget长期无响应 | Resolving genomes.queensu.ca... failed: Temporary failure in name resolution. |
解决方法:
- 更换镜像源:我个人习惯用国内镜像(如清华、中科大),速度能快很多。Kraken2官方也提供了多个备用地址。
- 增加超时时间:wget加上
--timeout=0或者设置一个大值。 - 使用断点续传:
curl -C -或wget -c,中断后不必重头再来。
我的经验:有一回帮同事配环境,他在内网机器上跑,每次都是卡在50%左右超时。后来发现是公司防火墙限制了长时间连接。改成wget -c --timeout=1800,再配合代理,总算一宿下完了。你想想看,断点续传在这个场景下简直就是救命稻草。
# 使用 curl 断点续传
curl -C - -O https://genome-idx.s3.amazonaws.com/kraken/k2_standard_20230605.tar.gz
# 使用 wget 增加超时并续传
wget -c --timeout=3600 https://genome-idx.s3.amazonaws.com/kraken/k2_standard_20230605.tar.gz
2.2 数据库源URL变更
Kraken2的官方数据库托管在Amazon S3和几个大学站点上。这些URL偶尔会调整。我记得有一次,Ben Langmead实验室迁移了服务器,旧链接直接404。
如何发现:日志里出现 HTTP 404 或 403 Forbidden。更隐蔽的情况是重定向到了错误的页面,下载下来的是一个HTML而不是tar.gz。
解决方法:
- 检查官方最新URL:去Kraken2 GitHub仓库的README或者Wiki,那里会列出当前有效的数据库下载链接。
- 更新下载脚本:如果你在用自动化脚本(比如
kraken2-build --download-taxonomy),记得升级到最新版本的Kraken2,它内置的URL列表会同步更新。 - 手动指定URL:可以用
--db-url参数覆盖默认路径。
避坑指南:千万别从百度网盘或者不明来源下载数据库压缩包。我曾经图省事用了别人分享的百度云链接,结果解压后校验和不对,跑了半天分类全错了。老老实实去官方渠道拿。
# 手动指定一个已知有效的数据库URL
kraken2-build --download-library bacteria --db-url https://genome-idx.s3.amazonaws.com/kraken/
2.3 代理设置错误
很多实验室或公司网络需要设置HTTP/HTTPS代理才能访问外网。但Kraken2的下载工具(比如内置的curl/wget调用)默认不会读取系统代理环境变量。这就导致明明浏览器能上网,命令行却下载不了。
典型错误:
Could not resolve host: genome-idx.s3.amazonaws.comcurl: (7) Failed to connect to ... Connection refused
解决方法:
| 场景 | 解决方式 |
|---|---|
| 使用 wget/curl 手动下载 | 设置 http_proxy 和 https_proxy 环境变量 |
| 使用 kraken2-build 自动下载 | 在命令前加上 export http_proxy=http://your-proxy:port; export https_proxy=$http_proxy; |
| 使用 conda 安装的 Kraken2 | 检查 conda 代理设置是否一致 |
# 设置代理环境变量(临时)
export http_proxy=http://proxy.example.com:8080
export https_proxy=http://proxy.example.com:8080
# 然后执行下载
wget -c https://genome-idx.s3.amazonaws.com/kraken/k2_standard_20230605.tar.gz
我的教训:有次我在新搭建的服务器上用 kraken2-build --standard,等了半小时报错。查了半天发现系统里装了某个安全软件,劫持了代理端口。直接把代理设成 http://127.0.0.1:3128 也不行。后来用 curl -v 看详细过程,才发现真正的代理地址是 http://company-proxy:8080。嗯,细节决定成败啊。
2.4 磁盘空间不足导致下载中断
这一条最容易被忽视。Kraken2的完整标准数据库解压后要占用约70GB以上的空间,下载的压缩包本身也有40GB左右。很多人只看了压缩包大小,没算解压后的占用量。
错误表现:
- 下载到99%卡死,然后报
No space left on device - 解压时报
write error: disk full df -h看到目标分区已用100%
解决方法:
- 提前检查磁盘:
df -h /path/to/db_directory,确保至少有150GB空闲。 - 使用
--db-path指定大分区:比如挂载在/data的磁盘。 - 边下载边解压:如果确信空间够,可以考虑用管道直接解压,避免同时存压缩包和原始文件。
# 检查磁盘空间
df -h /data
# 指定数据库存放路径(假设 /data 有足够空间)
kraken2-build --standard --db /data/kraken_db
# 边下载边解压(节省压缩包占用)
curl -L https://genome-idx.s3.amazonaws.com/kraken/k2_standard_20230605.tar.gz | tar xz -C /data/kraken_db
特别提醒:有些系统临时目录 /tmp 空间很小,而 kraken2-build 在下载过程中可能会先把临时文件放到 /tmp 再移动。我遇到过 /tmp 只有10GB,下载到一半就崩了。解决方法是设置 TMPDIR 环境变量指向一个有足够空间的地方。
# 设置临时目录到 /data/tmp
mkdir -p /data/tmp
export TMPDIR=/data/tmp
kraken2-build --standard --db /data/kraken_db
2.5 综合排查清单
如果你实在找不到具体原因,可以按下面这个顺序逐一核查。我把它们列成了一张表,方便你对照。
| 步骤 | 检查项 | 快速验证命令 |
|---|---|---|
| 1 | 网络连通性 | ping genome-idx.s3.amazonaws.com |
| 2 | DNS解析 | nslookup genome-idx.s3.amazonaws.com |
| 3 | 代理配置 | echo $http_proxy |
| 4 | 磁盘空间 | df -h /data 和 df -h /tmp |
| 5 | URL是否有效 | curl -I https://genome-idx.s3.amazonaws.com/kraken/k2_standard_20230605.tar.gz |
| 6 | 文件系统权限 | touch /data/test_write && rm /data/test_write |
最后一句个人建议:别指望一次就能顺利下完。大文件下载就是个体力活。我之前在实验室里,经常是下班前挂上 wget -c,第二天早上来看结果。中间断几次太正常了,只要你会断点续传、会换源、会设代理,这都不是事。