2015-12-22 1 views
0

Моя проблема может быть результатом моего непонимания с глобальной согласованностью в хранилище Google, но поскольку я не испытывал эту проблему до недавнего времени (в середине ноября), и теперь она кажется легко воспроизводимой, я хотел кое-каких разъяснений. Проблема начала происходить в куске искрового кода, запущенного на вычислительном движке с использованием bdutil, но я могу воспроизвести из командной строки gsutil.GCS - глобальная согласованность с удалением + переименование

Мой код удаляет путь назначения и сразу же переименовывает путь источника в качестве пути назначения. С глобальной согласованностью, которую я ожидал бы, поскольку путь назначения больше не существует, src будет переименован в пункт назначения, но вместо этого src вложен внутри адресата, как если бы назначение все еще существовало и это не было согласованным.

Hadoop код для воспроизведения выглядит следующим образом:

fs.delete(new Path(dest), true) 
fs.rename(new Path(src), new Path(dest)) 

Из командной строки можно воспроизводящий:

gsutil -m rm -r gs://mybucket/dest 
gsutil -m cp -r gs://mybucket/src gs://mybucket/dest 

Если причина в том, что список операции в конечном счете, последовательные и реализация FileSystem использует чтобы определить, существует ли место назначения, тогда я понимаю, а затем есть ли рекомендованное решение, чтобы гарантировать, что пункт назначения больше не существует до переименования?

Спасибо, Люка

ответ

1

чтение после записи (включая удаление) операции сильно целостные, например, если вы сделали:

gsutil -m rm -r gs://mybucket/dest 
# Command output shows it removed gs://mybucket/dest/file1 
gsutil cp gs://mybucket/dest/file1 my_local_dir/file1 

Это всегда будет терпеть неудачу.

Однако, чтобы определить, существует ли «каталог», gsutil должен выполнить согласованную операцию перечисления, чтобы выяснить, имеет ли какой-либо объект в пространстве имен имен Google Cloud Storage префикс с именем этого «каталога». Это может привести к описанной вами проблеме, и я ожидаю, что код hadoop ведет себя аналогичным образом.

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

+0

Спасибо. Я думаю, что я перепроектирую поток данных, поэтому я всегда создаю новый «каталог» с меткой времени в имени, вместо того, чтобы пытаться заменить существующий «каталог», – lukeforehand

Смежные вопросы