GCP Storage Buckets Transfer - PullRequest
       70

GCP Storage Buckets Transfer

0 голосов
/ 24 мая 2018

Я пытаюсь переместить 15 миллионов файлов (4 ТБ) из различных сегментов, используя gsutil mv.К сожалению, предыдущие имена файлов не имеют общих общих префиксов ;вместо этого они все постфиксируются с нашими идентификаторами "filetype".

Во время этой передачи я также пытаюсь переименовать файлы, чтобы предотвратить этот беспорядок в будущем.

Это наш текущий формат файла:

gs://{bucket}/{hash}-{filetype}.{extn}

Этот формат я переименовываю в них:

gs://{bucket}/{filetype}/{hash}.{extn}

Текущее решение:

Поскольку текущий формат не подходит для «префиксных» селекторов, я должен сделать следующее:

let { stdout } = spawn('gsutil', ['ls', `${OLD_BUCKET}/*-${TYPE}`]);
createInterface({ input:stdout }).on('line', str => {
  if (!str.length) return;
  let [hash] = str.replace(OLD_BUCKET, '').split('-');
  let nxt = `${NEW_BUCKET}/${TYPE}/${hash}.${extn}`;
  spawnSync('gsutil', ['mv', str, nxt]);
});

Мягко отредактировано для краткости.

Как ни странно, gsutil ls - единственная команда, которая распознает шаблоны на основе глобуса.Воспользовавшись этим, я передаю каждую строку в свой «преобразователь формата», а затем использую gsutil mv для инициации передачи.

Это действие выполняется на 16-ядерном компьютере, причем каждое ядро ​​выполняетта же задача - но ls 'с другим типом файла.

Проблема

Это невероятно медленно!

Я добавил больше серверов и больше ядер, и я не могу разбить 26 файлов в минуту на каждый тип файла.Я также попытался добавить флаг -m к gsutil mv без разницы - потому что mv вызывается один раз на строку.

У нас есть 13 типов файлов;Таким образом, 20 280 файлов передаются в час.Сравните это с инструментом GCP «Transfer», который скопировал 5M файлов из BucketA в BackupA менее чем за час.

Вопрос

Есть ли способ ускорить это?

По текущему курсу я смотрю 15 дней до завершения перевода (ов), оплачивая по часам ?

1 Ответ

0 голосов
/ 24 мая 2018

Я не очень знаком с Rust, но из того, что я знаю, работая с GCP и c ++ (например, управление), самая медленная часть ожидает ответа Google на каждую операцию (например, gutil ls или gutil mv),Таким образом, даже на 16-ядерном компьютере большинство потоков будут простаивать в ожидании ответа Google на эту операцию.

Так что вы, вероятно, хотите оптимизировать количество запросов, которые вы делаете, и позволить Google выполнитьтяжелая работа.(Вы также платите за ресурсы, используемые Google для выполнения этих операций, за исключением экземпляра виртуальной машины, который выполняет запросы)

Проверка документации gsutil mv говорит, что -mсделайте эту операцию многопоточной (в службе перемещения Google), но она будет работать только в том случае, если эти же запросы включают в себя несколько файлов для перемещения.

Также в документах упоминается, что gsutil mv является расширением gsutil cp который копирует файлы в целевой путь, а затем выполняет удаление по старому пути ( документация gsutil cp ), унаследовав параметры команды.

Так что мой совет будет для вас попытатьсясожмите запросы, используя Name WildCards , и проверьте в gsutil cp документах список флагов, которые вы также можете установить на mv.

Извините, что не отправил кодовый ответ, времянемного коротко для меня.Надеюсь, это поможет вам в каком-то направлении:)

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