Как получать уведомления после завершения всех загрузок `aws s3`?

Я знаю, что означает исходный вопрос, и ответ неwget -c...

Сценарий можно описать следующим образом:

# Start mirroring a site
wget -m http://...
# 400MB later wget died or interrupted,
# don't know where it left off, don't care,
# just want to get the remaining 100MB without getting the first 400MB again
wget -nc -r -l inf --no-remove-listing http://...

Опции «-r -l inf --no -remove -listing» эквивалентны -m без параметра -N. Добавление параметра -nc позволяет избежать сохранения первых 400 МБ на жестком диске.

1
29.04.2020, 08:49
2 ответа

Если вы сделаете много из них одновременно, вы быстро перегрузите свой локальный ящик, потому что вы запустите множество процессов одновременно.

Лучше сделать одно из следующего:

  • Если файлы имеют общий префикс, сделайте рекурсивную копию:

    aws s3 cp --recursive s3://my-bucket/path/.
    
  • Творческое использование aws s3 cp --excludeи --include-, т. е. исключение всего, кроме того, что указано в списке включения.

    aws s3 cp --recursive --exclude '*' \
              --include 'path1/file1.txt' --include 'path2/file2.txt' \
              s3://my-bucket/.
    
  • Используйте s3cmd --include-from file.txt, который позволяет вам поместить требуемые имена файлов во входной файл.

    ~ $ cat include-filenames.txt
    path1/file1.txt
    path2/file2.txt
    
    ~ $ s3cmd get --recursive --exclude '*' \
                  --include-from include-filenames.txt \
                  s3://my-bucket/.
    

И нет, AWS не предоставляет никакого способа для мониторинга этого -, который работает на вашем локальном ноутбуке/сервере, вы должны отслеживать его там.

Надеюсь, это поможет:)

0
19.03.2021, 02:21

В конце я написал скрипт на python, чтобы гарантировать, что в любой момент времени будет происходить только 10 одновременных загрузок s3

#!/usr/bin/env python3
import os
import sys
import boto3
from multiprocessing import Pool


BUCKET = "my-bucket"

s3 = boto3.client("s3")


def download_s3_file(params):
    """ If the files exists, assume download is already performed and done
    """
    src, dest = params
    if os.path.exists(dest) and os.path.isfile(dest):
        print(f"The file {dest} is already downloaded ")
        return
    print("Downloading", BUCKET, src, dest)
    print("process id:", os.getpid())
    try:
        s3.download_file(BUCKET, src, dest)
    except Exception as e:
        print(e)


def main():
    filelist = sys.argv[1]
    print("parent process:", os.getpid())
    print("Working on ", filelist)
    jobs = []
    for l in open(filelist, "r"):
        # Ignore commented lines
        if not l.startswith("#"):
            src, dest = l.strip().split(",")
            jobs.append((src, dest,))
    with Pool(10) as p:
        p.map(download_s3_file, jobs)


if __name__ == "__main__":
    main()
0
19.03.2021, 02:21

Теги

Похожие вопросы