Який найшвидший спосіб скопіювати 400G файлів з еластичного блоку ec2, зберігаючи об'єм до s3?


21

Мені доведеться скопіювати 400G файлів з гучності блоку еластичного блоку в відро s3 ... Це близько 300k файлів ~ 1 Мб

Я спробував s3cmd і s3fuse , вони обоє справді, дуже повільно .. s3cmd біг цілий день, сказав, що закінчив копіювання, і коли я перевірив відро, нічого не сталося (я вважаю, щось пішло не так, але принаймні s3cmd ніколи нічого не скаржився)

S3Fuse працює інший повний день і скопіював менше 10% файлів ...

Чи є для цього краще рішення?

У мене звичайно працює Linux (ubuntu 12.04)


2
Багато орієнтирів (наприклад, цей ) продемонстрували 3 визначальних коефіцієнта пропускної здатності до S3: 1) розмір файлу 2) кількість паралельних потоків та 3) розмір екземпляра. Між 64 та 128 паралельними (одночасними) завантаженнями об'єктів 1МБ повинно насичуватися висхідна лінія 1Гбіт / с, що має m1.xlarge і навіть повинна насичувати 10Gbps висхідної лінії зв'язку кластерного обчислення (cc1.4xlarge). З цим слід пам’ятати багато сценаріїв (наприклад, ця модифікація або s3cmd)
cyberx86

1
s3-паралельний ставити зробив трюк!
асеба

Відповіді:


20

Існує кілька ключових факторів, які визначають пропускну здатність від EC2 до S3:

  • Розмір файлу - менші файли потребують більшої кількості запитів, а також більше накладних витрат і повільніше передавання. Коефіцієнт посилення розміру файлів (при походженні з EC2) незначний для файлів більше 256 КБ. (В той час, як передача з віддаленого місця з більш високою затримкою, як правило, продовжує демонструвати помітні поліпшення, поки між 1MiB та 2MiB).
  • Кількість паралельних потоків - одна нитка завантаження зазвичай має досить низький рівень - часто нижче 5 Мбіт / с. Пропускна здатність збільшується із кількістю одночасних ниток і має максимум між 64 і 128 потоками. Слід зазначити, що більші екземпляри здатні обробляти більшу кількість одночасних потоків.
  • Розмір екземпляра - Відповідно до специфікацій екземпляра , більші екземпляри мають більше виділених ресурсів, включаючи більший (і менш змінний) розподіл пропускної здатності мережі (і введення / виведення в цілому - включаючи зчитування з ефемерних / EBS-дисків - які приєднані до мережі. Типово Значення чисел для кожної категорії:
    • Дуже високий: теоретичний: 10Gbps = 1250MB / s; Реалістичний: 8,8 Гбіт / с = 1100 МБ / с
    • Високий: теоретичний: 1Gbps = 125MB / s; Реалістичний: 750Mbps = 95MB / s
    • Помірний: Теоретичний: 250 Мбіт / с; Реалістичний: 80Mbps = 10MB / s
    • Низький: теоретичний: 100 Мбіт / с; Реалістичний: 10-15Mbps = 1-2MB / s

У випадках передачі великої кількості даних може бути економічно практичним використання екземпляра обчислення кластера, оскільки ефективний коефіцієнт посилення пропускної здатності (> 10x) перевищує різницю у витратах (2-3x).

Хоча вищезазначені ідеї є досить логічними (хоча обмеження на кожну нитку може і не бути), знайти еталони, що їх резервують, досить легко. Один особливо детальний ви можете знайти тут .

Використовуючи між 64 та 128 паралельними (одночасними) завантаженнями об'єктів 1МБ, слід наситити вихідну лінію 1 Гбіт / с, що має m1.xlarge і навіть повинна наситити 10Gbps висхідної лінії зв'язку кластерного обчислення (cc1.4xlarge).

Хоча міняти розмір екземпляра досить просто, іншими двома факторами може бути важче керувати.

  • Розмір файлів зазвичай фіксований - ми не можемо об'єднати файли разом на EC2 і розділити їх на S3 (тож, малих файлів ми не можемо зробити). Однак великі файли ми можемо розділити на стороні EC2 і знову зібрати на стороні S3 (використовуючи багаточастинне завантаження S3). Як правило, це вигідно для файлів розміром більше 100 МБ.
  • Паралельні нитки трохи важче задовольнити. Найпростіший підхід зводиться до написання обгортки для деякого існуючого сценарію завантаження, який запустить декілька копій одразу. Кращі підходи використовують API безпосередньо для досягнення чогось подібного. Маючи на увазі, що ключ - це паралельні запити, не важко знайти декілька потенційних сценаріїв, наприклад:
    • s3cmd-модифікація - вилка ранньої версії s3cmd, яка додала цю функціональність, але не оновлювалася протягом декількох років.
    • s3-paralle-put - досить недавній сценарій python, який добре працює

8

Отже, після безлічі тестувань s3-paralel-put зробив трюк приголомшливо. Зрозуміло рішення, якщо вам потрібно завантажити багато файлів на S3. Дякуємо cyberx86 за коментарі.


3
З цікавості, а) скільки часу знадобилося для завантаження 400 Гб b) скільки ниток ви використовували c) який розмір екземпляра ви використовували?
cyberx86

1
@ Cyberx86 Нещодавно я використав s3-паралельний набір на великий екземпляр Ec2. Я використав 5 ниток, і він скопіював 288,73 ГБ за 10,49 годин.
Гортрон

4

Налаштуйте значення конфігурації AWS CLI S3 відповідно до http://docs.aws.amazon.com/cli/latest/topic/s3-config.html .

Нижче збільшено швидкість синхронізації S3 принаймні на 8 разів!

Приклад:

$ more ~/.aws/config
[default]
aws_access_key_id=foo
aws_secret_access_key=bar
s3 =
   max_concurrent_requests = 100
   max_queue_size = 30000

2

Я написав оптимізовану консольну програму в C # ( CopyFasterToS3 ) для цього. Я використовував в EBS vol, і в моєму випадку він мав 5 папок з більш ніж 2 мільйонами файлів об'ємом 20 Гбіт. Сценарій виконується менш ніж за 30 хвилин.

У цій статті я показав, як використовувати рекурсивну функцію з паралеллю. Ви можете переписати його на іншу мову.

Удачі!




1

Спробуйте використовувати s3-cli замість s3cmd. Я використовував його замість s3cmd для завантаження файлів у своє відро s3, і це зробило моє розгортання швидше майже на 17 хвилин (з 21 до 4 хвилин)!

Ось посилання: https://github.com/andrewrk/node-s3-cli

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.