您好,我正在尝试一次下载大量文件;准确地说是279。每个都是大 BAM (~90GB)。我正在工作的集群有多个节点,幸运的是我可以一次分配多个实例。
鉴于这种情况,我想知道我是否可以使用wget
批处理文件(看示例如下)将每个下载分配到单独的节点以独立执行。
批处理文件.txt
<https_link_1> -O DNK07.bam
<https_link_2> -O mixe0007.bam
<https_link_3> -O IHW9118.bam
.
.
原则上,这不仅会加快速度,还会防止运行失败,因为此执行的挂机时间为 24 小时,并且不足以在一台计算机上连续下载所有这些文件。
我的 BASH 脚本如下所示:
#!/bin/bash
#
#SBATCH --nodes=279 --ntasks=1 --cpus-per-task=1
#SBATCH --time=24:00:00
#SBATCH --mem=10gb
#
#SBATCH --job-name=download
#SBATCH --output=sgdp.out
##SBATCH --array=[1-279]%279
#
#SBATCH --partition=<partition_name>
#SBATCH --qos=<qos_type>
#
#SBATCH --account=<user_account>
#NAMES=$1
#d=$(sed -n "$SLURM_ARRAY_TASK_ID"p $NAMES)
wget -i sgdp-download-list.txt
正如你所看到的,我正在考虑使用 an array job
(不确定是否有效);或者,我考虑分配 279 个节点,希望 SLURM 能够足够聪明地将每个下载发送到一个单独的节点(不确定......)。如果您知道一种有效的方法,欢迎提出任何建议。提前致谢!
答案1
将命令展开为多个wget
命令,以便您可以将它们作为列表发送到 SLURM:
while IFS= read -r url; do
printf 'wget "%s"\n' "$url"
done < sgdp-download-list.txt > wget.sh
或者,如果您sgdp-download-list.txt
只是一个开头wget
缺少命令的列表(这就是您的示例所建议的),只需使用:wget
sed 's/^/wget /' sgdp-download-list.txt > wget.sh
然后,将其wget.sh
作为作业提交。
答案2
框架挑战
您说的是 25 TB 的下载量。我想您会发现获取节点是您最不担心的事情。如果它们来自同一远程站点,则远程站点也可能存在 CPU 问题。更重要的是,网络带宽是一个问题。如果您尝试通过一个管道拉取此下载,那么拉动多少个节点实际上并不重要 - 管道将是限制。
话虽如此,wget 并不是特别占用 CPU 资源。就 CPU 而言,在一个节点上并行运行 10 个程序应该不是问题。
如果这是一项常规活动,我建议您查看是否可以下载增量。
选择
Usenet 有一个老笑话。有人问每天从洛杉矶发送大量数据到旧金山的最佳方式是什么。答案:UPS。网络速度提高了,但音量也提高了。亚马逊牢记这一点:他们可以向您运送一个盒子来将数据加载到其中,然后运回以将其放入他们的云中。
答案3
嗨@terdon 和@David G.,
这么晚才回复很抱歉。最后,集群上的技术支持向我推荐了一种使用数据移动器节点的临时方法,我可以通过该方法连续下载直到链接过期。
然后,我只需重新生成它们并重新开始该过程。这不是总体上最快的过程(大约花了一周),但考虑到下载的大量数据也不算太糟糕!