随着转录组研究的深入,研究人员需要从转录组数据库中获取大量的 RNA 测序数据以支持基因表达、选择性剪接等分析。除了我们常用的 GEO(基因表达总库)和 ArrayExpress 数据库,还有一些数据库可以获得 RNA 测序数据比如 Node 转录组数据库 (National Omics Data Encyclopedia, 国家组学数据百科全书:多组学大数据共享平台,Node 数据库)。在本文中,我们将详细介绍 Node 转录组数据库的特点及其批量下载方法,帮助您高效获取所需数据。

本文用到的软件均可以使用 conda 直接下载安装。

一、Node 转录组数据库简介

Node 数据库是一个多组学数据平台,它为研究人员提供了一个集中的数据存储和访问接口,主要包括这些数据类型:

  • DNA 数据:如全基因组测序(WGS)、外显子组测序(WES)、靶向测序等。
  • RNA 数据:如 RNA-Seq 数据(转录组测序)、单细胞 RNA-Seq、非编码 RNA 等。
  • 其他数据:蛋白质组、代谢组、表观遗传学数据等。

下面是官网介绍:

NODE 是一个生物大数据收集平台,包括实验样本信息的收集、序列文件的上传以及结果的分析、共享和下载。NODE 平台由六个主要模块组成:项目、样本、实验、运行、数据和分析。项目和样本是独立的,但可以通过运行进行链接,这样可以实现元数据和序列信息的整合。
help - Node - National Omics Data Encyclopedia

生物医学大数据中心隶属于中国科学院上海营养与健康研究所,致力于 1) 为中国科学院、上海及全国的生物医学研究提供全周期大数据服务,包括数据收集和共享、数据管理和分析;2) 构建数据安全、整合、共享和挖掘的技术框架,加速生物医学数据资源的协作网络;3) 增强国家生物医学大数据系统,促进生命科学数据丰富发现的范式转变,加速生物学、医学、数学和信息技术之间的跨学科融合,提高国家的“融合研究”能力。
National Omics Data Encyclopedia

Node 数据库支持多种下载途径,包括 HTTP 和 SFTP。对于小文件,HTTP 可能是默认选择,但对于超过 200MB 的大文件,HTTP 下载可能受限,此时需要使用 SFTP。

二、在 HTTP 无法下载 200MB 文件时如何使用 SFTP

当文件大小超过 200MB 时,Node 数据库可能出于服务器限制或安全考虑,禁止通过 HTTP 下载。此时,SFTP(Secure File Transfer Protocol)成为理想选择。SFTP 通过 SSH 协议加密传输数据,确保安全性和稳定性,非常适合大文件的批量下载。

1. SFTP 下载工具介绍

以下是常用的 SFTP 下载工具:

  • sftp 命令行工具:Unix-like 系统(如 Linux、macOS)内置的工具,支持交互式文件传输。
  • lftp:功能强大的命令行工具,支持 SFTP、FTP 等多种协议,适合自动化和批量下载。
  • 图形化客户端:如 FileZilla、Cyberduck,提供直观界面,但不适合脚本化操作。
  • 编程库:如 Python 的 Paramiko 或 Node.js 的 ssh2-sftp-client,适用于开发自定义下载脚本。

对于批量下载,命令行工具(如 sftp 和 lftp)因其灵活性和可脚本化特性更为推荐。

2. 使用命令行下载

使用 sftp 基本下载

1
sftp 用户名@主机地址

连接成功后,可使用以下命令:

  • 下载单个文件:get 远程文件 本地文件
  • 下载多个文件:mget *.txt(支持通配符)

示例:

1
2
sftp> get data.fastq /local/path/data.fastq
sftp> mget *.fastq

sftp 适合简单下载,但对于批量任务,操作繁琐,建议使用 lftp。

三、使用 lftp 的 pget 进行多线程下载

lftp 是一个功能强大的文件传输工具,支持 SFTP,并提供多种高级功能。然而,需注意:SFTP 基于 SSH,通常使用单一连接,因此其 pget 命令的多线程下载功能在 SFTP 协议下可能受限。多线程下载(如文件分段并行)更适用于 HTTP 或 FTP(若服务器支持范围请求)。尽管如此,lftp 仍可通过并行连接下载多个文件,从而提升效率。

基本使用

1
lftp sftp://用户名@主机地址

下载单个文件:

1
lftp> get remote_file.txt

使用 pget 下载

pget 是 lftp 的一个子命令,通常用于加速下载。对于支持多线程的协议(如 HTTP/FTP),可通过-n参数指定线程数:

1
lftp -e "pget -n 4 remote_file.txt" sftp://用户名@主机地址

但对于 SFTP,由于协议限制,pget 无法将单个文件分割成多线程下载。因此,若目标是单个大文件,下载仍为单线程。对于支持 ftp 或 http 的服务器,pget 可以显著提高下载速度。

并行下载多个文件

虽然 SFTP 不支持单文件多线程,但 lftp 可以通过设置多个并发连接来同时下载多个文件。配置方法如下:

1
2
3
4
5
lftp -u 用户名,密码 sftp://主机地址 << EOF
set sftp:max-connections 5
mirror 远程目录 本地目录
bye
EOF
  • sftp:max-connections 5:设置最多 5 个并发连接。
  • mirror:递归下载整个目录。
  • 主机地址: Node 数据库的 SFTP 地址。fms.biosino.org:44398
  • 用户名,密码: Node 数据库的用户名和密码。
  • 远程目录: 远程服务器上的目录路径。
  • 本地目录: 本地存储目录。
  • EOF:结束 lftp 命令。
  • bye:退出 lftp。

这将并行下载多个文件,显著缩短总耗时。

但是在 node 数据库中,fastq 文件往往不是在同一个文件夹内,所以我们往往无法使用 mirror 命令来下载所有的 fastq 文件,这时我们需要在脚本中使用循环来实现。

四、使用 Shell 脚本批量下载

Shell 脚本结合 lftp 可以实现自动化批量下载,适合处理大量文件或定时任务。

下载指定文件列表

首先我们需要从官网获取目标文件的下载链接。我们可以在官网上下载到一个 experiment_OEX***_data_download_link 的文件,这个文件中包含了我们需要下载的所有文件的链接。

主要信息有:

  • project_id:项目 ID
  • experiment_id:实验 ID
  • sample_id:样本 ID
  • run_id:运行 ID
  • data_id:数据 ID
  • security:安全性
  • fileName:文件名
  • url:下载链接
  • ftp_file_path:FTP 文件路径
  • MD5:文件的 MD5 值

其中,ftp_file_path 是我们需要下载的文件的路径,url 是我们可以直接下载的链接。

如果文件均小于 200MB,我们可以直接使用 wgetaxel 命令来下载,这样是最快速便捷的。可惜,单细胞的数据都在 15G 以上,所以我们需要使用 SFTP 来下载。

下载指定文件

以下脚本下载一组指定文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash

USER="用户名"
PASSWORD="密码"
HOST="主机地址"
REMOTE_DIR="/path/to/remote/dir"
LOCAL_DIR="/path/to/local/dir"
MAX_JOBS=5 # 最大并行任务数
files_num=$(wc -l < dw_links.txt)

if [ -f "dw_links.txt" ]; then
while IFS= read -r REMOTE_PATH; do
REMOTE_PATH=$(echo $REMOTE_PATH | xargs) # 去除多余的空格
FILENAME=$(basename "$REMOTE_PATH") # 提取文件名
echo "Preparing to download $FILENAME from $REMOTE_PATH..."

# 使用 lftp 的 get 命令进行下载
echo "Downloading $FILENAME..."
(
lftp -u $USER,$PASSWORD sftp://$HOST << EOF
# get $REMOTE_PATH -o $LOCAL_PATH/$FILENAME
pget -n 1 $REMOTE_PATH -o $LOCAL_PATH/$FILENAME
bye
EOF
) & # 将下载任务放入后台

# 限制并行任务数
while [ $(jobs -r | wc -l) -ge $MAX_JOBS ]; do
echo "Current running jobs: $(jobs -r | wc -l)"
sleep 1 # 等待任务完成
done

done <dw_links.txt

# 等待所有后台任务完成
wait
else
echo "dw_links.txt doesn't exist!"
fi
  • &:将每个下载任务放入后台运行,实现并行。
  • wait:等待所有任务完成。
  • MAX_JOBS:设置最大并行任务数,避免过多连接导致服务器拒绝服务,如果pget设置了 n 参数比如 4, 这里要相应的乘以 4。

注意,dw_links.txt 文件中包含要下载的文件列表,每行一个文件路径。脚本会读取该文件并逐个下载。如:

1
2
/Public/byRun/OER00/OER0008/OER000883/OER00088390/GBC_C_4_S1_L001_R2_001.fastq.gz
/Public/byRun/OER00/OER0008/OER000883/OER00088387/GBC_C_1_S1_L001_R1_001.fastq.gz

此脚本使用 5 个并发连接递归下载远程目录。

注意事项

  • 服务器限制:并行连接数应根据服务器政策调整,避免超限导致连接失败。
  • 大文件处理:SFTP 下单个大文件无法多线程,若需加速,可检查数据库是否支持 FTP/HTTP 替代协议。

五、总结

Node 转录组数据库为研究者提供了丰富的 RNA 测序数据资源。在 HTTP 无法下载超过 200MB 文件的情况下,SFTP 结合 lftp 成为高效解决方案。通过 sftp 进行基础下载,或利用 lftp 的并行连接功能批量获取多个文件,再配合 Shell 脚本自动化操作,您可以轻松管理大规模数据下载任务。尽管 SFTP 不支持单文件多线程下载,但通过优化多文件并行策略,仍可显著提升效率。希望本文能助您顺利开展转录组研究!

六、篇外

sftp 的 get 命令有一个问题是如果检测到本地文件已经存在就不会下载了,而这个本地文件不一定是完整的。我们可以使用 -a 参数来强制覆盖本地文件,但是我们需要先效验文件的完整性,而我们从官网下载到的 experiment_OEX***_data_download_link 文件中是有文件的 md5 值。
我们可以使用 md5sum 命令来计算文件的 md5 值,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

# 检查 dw_links.txt 是否存在
REMOTE_DIR="/path/to/remote/dir"
LOCAL_DIR="/path/to/local/dir"
LOCAL_MD5_RECORD="$LOCAL_DIR/local_md5_record.txt"
MD5_FILE="/path/to/md5_file.txt"
MAX_JOBS=5 # 最大并行任务数

if [ -f dw_links.txt ]; then
# 逐行读取 dw_links.txt 中的路径
while IFS= read -r REMOTE_PATH; do
REMOTE_PATH=$(echo $REMOTE_PATH | xargs) # 去除多余的空格
FILENAME=$(basename "$REMOTE_PATH") # 提取文件名
echo "Preparing to download $FILENAME from $REMOTE_PATH..."

# 检查文件是否已存在并校验
if [ -f "$LOCAL_PATH/$FILENAME" ]; then
if grep -q "$FILENAME" "$LOCAL_MD5_RECORD"; then
echo "$FILENAME already verified. Skipping."
continue
fi

# 计算 MD5 并校验
file_md5=$(md5sum "$LOCAL_PATH/$FILENAME" | awk '{print $1}')
if grep -q "$file_md5" "$MD5_FILE"; then
echo "$FILENAME is valid. Recording MD5 locally."
echo "$FILENAME $file_md5" >>"$LOCAL_MD5_RECORD"
continue
else
echo "$FILENAME exists but failed verification. Deleting."
rm -f "$LOCAL_PATH/$FILENAME"
fi
fi

# 使用 lftp 的 get 命令进行下载
echo "Downloading $FILENAME..."
(
# 使用 lftp 的 get 命令进行下载
# lftp -u $USER,$PASSWORD sftp://$HOST << EOF

# 下载完成后校验 MD5
if [ -f "$LOCAL_PATH/$FILENAME" ]; then
file_md5=$(md5sum "$LOCAL_PATH/$FILENAME" | awk '{print $1}')
if grep -q "$file_md5" "$MD5_FILE"; then
echo "$FILENAME is valid. Recording MD5 locally."
echo "$FILENAME $file_md5" >>"$LOCAL_MD5_RECORD"
else
echo "$FILENAME downloaded but failed verification. Deleting."
rm -f "$LOCAL_PATH/$FILENAME"
fi
fi
) & # 将下载任务放入后台

# 限制并行任务数
while [ $(jobs -r | wc -l) -ge $MAX_JOBS ]; do
echo "Current running jobs: $(jobs -r | wc -l)"
sleep 1 # 等待任务完成
done

done <dw_links.txt

# 等待所有后台任务完成
wait
else
echo "dw_links.txt doesn't exist!"
fi