2. 数据库下载失败:那些年我踩过的坑

数据库下载是整个Kraken2流程的第一步,也是最容易出问题的一步。你可能遇到过:跑到一半卡住了,或者压根连不上,再或者磁盘满了报错。说实话,我最早接触Kraken2时,光下载数据库就折腾了整整一个下午。今天就掰开揉碎聊一聊这几种常见错误,以及怎么对付它们。

Kraken2 数据库下载故障排查流程 开始下载数据库 网络连接超时? URL 已变更? 代理设置 / 磁盘空间不足? 处理建议 · 重试 / 换源 · 检查 URL 并更新脚本 · 配置代理 / 清理磁盘

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。

解决方法:

  1. 检查官方最新URL:去Kraken2 GitHub仓库的README或者Wiki,那里会列出当前有效的数据库下载链接。
  2. 更新下载脚本:如果你在用自动化脚本(比如 kraken2-build --download-taxonomy),记得升级到最新版本的Kraken2,它内置的URL列表会同步更新。
  3. 手动指定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.com
  • curl: (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%

解决方法:

  1. 提前检查磁盘:df -h /path/to/db_directory,确保至少有150GB空闲。
  2. 使用 --db-path 指定大分区:比如挂载在 /data 的磁盘。
  3. 边下载边解压:如果确信空间够,可以考虑用管道直接解压,避免同时存压缩包和原始文件。
# 检查磁盘空间
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,第二天早上来看结果。中间断几次太正常了,只要你会断点续传、会换源、会设代理,这都不是事。