GCP Python копировать большие файлы между корзинами - PullRequest
0 голосов
/ 12 марта 2020

У меня есть куча хранилищ, которые публикуют sh уведомлений в Pub / Sub topi c при загрузке файлов. Затем у меня есть облачная функция, подписанная на Pub / Sub topi c, которая копирует эти файлы в их конечные целевые группы. Все это прекрасно работает для большинства файлов, но когда у меня большие файлы (> 1 ГБ), они не могут скопировать. Исходные сегменты являются мультирегиональными, а конечные сегменты - региональными и близкими к линиям.

Мой код по существу:

client = storage.Client()
src_bucket = client.get_bucket(src_bucket_name)
src_blob = src_bucket.get_blob(src_filename)
dst_bucket = client.get_bucket(dst_bucket_name)
dst_blob = dst_bucket.blob(dst_filename)

dst_blob.rewrite(src_blob)

Первоначально функция облака работала по тайм-ауту через 60 секунд, поэтому я предположил, это была проблема, но затем я увеличил время ожидания функции облака до 540 секунд, но функция все еще не работает. У меня есть функция, повторяющаяся в течение 20 минут, поэтому я вижу, что проблема повторяется. После увеличения тайм-аута облачной функции я прочитал документы BLOB-объектов и увидел, что по умолчанию blob.rewrite также имеет тайм-аут по 60 секунд, поэтому я также увеличил его до 540 секунд, но он все еще истекает.

На данный момент я не уверен, что мне не хватает. Это проблема тайм-аута? Или это как-то связано с тем, что Pub / Sub публикует несколько сообщений, чтобы у меня могло быть несколько облачных функций, пытающихся сделать одну и ту же копию одновременно? Или есть ли лучший способ автоматического перемещения больших файлов между корзинами?

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Во-первых, немного о том, что происходит под капотом:

Перезапись в GCS - это оперативная операция. Когда запрос на перезапись подтверждает успешность, перезапись завершена, и новая операция готова. Недостатком является то, что пользователь должен держать открытым соединение перезаписи, пока копирование завершено. Однако соединение не длится вечно. Если операция займет больше, чем, скажем, 30 секунд или около того, запрос на перезапись может закончиться не завершенным. В этом случае он вернет маркер перезаписи, который клиент должен использовать для возобновления запроса, иначе дальнейший прогресс не будет достигнут.

В Python, который выглядит как-то например:

rewrite_token = False
while True:
  rewrite_token, bytes_rewritten, bytes_to_rewrite = dst_blob.rewrite(
      src_blob, token=rewrite_token)
  print(f'Progress so far: {bytes_rewritten}/{bytes_to_rewrite} bytes.')
  if not rewrite_token:
     break

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

Тем не менее, время ожидания - это не то, что я ожидаю увидеть из вашего кода. Это другой вид неудачи. Вы уверены, что ошибка, которую вы получаете, является тайм-аутом?

0 голосов
/ 12 марта 2020

Я заметил, что в строках 2 и 4 вашего кода у вас есть client.get_bucket - в документации GCP для этого не упоминается метод get_bucket: https://cloud.google.com/storage/docs/renaming-copying-moving-objects#storage -copy-object- python

(Вам нужно нажать на вкладку «Образцы кода», затем выбрать «Python», чтобы понять, о чем я говорю.)

ваш код работает локально в вашей собственной среде Python? Глупый вопрос, я знаю, но иногда люди просто go прямиком в облако. ¯ \ _ (ツ) _ / ¯

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