2015-12-22 59 views
0

我的問題可能是我對谷歌存儲全球一致性的誤解的結果,但由於我直到最近(11月中旬)纔有過這個問題,現在看起來很容易重現,所以我想要澄清一下。這個問題發生在使用bdutil運行在計算引擎上的一段spark代碼中,但是我可以使用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 

如果原因是因爲列表操作是最終一致和文件系統實現用列出操作以確定目標是否仍然存在,然後我明白了,然後是否有推薦的解決方案來確保重命名之前目標不再存在?

感謝, 盧克

回答

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會必須執行最終一致的上市運作,以找出是否在谷歌雲存儲的平面名稱空間中的任何對象有與「目錄」的名稱的前綴。這可能會導致您描述的問題,並且我期望hadoop代碼的行爲相似。

對於此問題,沒有一致的解決方法,因爲無法以強烈一致的方式檢查是否存在前綴。

+0

謝謝。我想我會重新設計數據流,因此我總是在名稱中創建一個帶有時間戳的新「目錄」,而不是試圖替換現有的「目錄」 – lukeforehand