2015-12-22 2 views
0

Mon problème peut provenir de mon incompréhension avec la cohérence globale du stockage google, mais comme je n'ai pas rencontré ce problème jusqu'à récemment (mi-novembre) et maintenant il semble facilement reproductible, je voulait des éclaircissements. Le problème a commencé à se produire dans un morceau de code spark s'exécutant sur le moteur de calcul en utilisant bdutil mais je peux reproduire à partir de la ligne de commande avec gsutil.GCS - Cohérence globale avec suppression + renommer

Mon code est en train de supprimer un chemin de destination, puis de renommer immédiatement un chemin source comme chemin de destination. Avec la cohérence globale je m'attendrais puisque le chemin de destination n'existe plus, le src serait renommé à la destination, mais à la place le src est imbriqué dans la destination comme si la destination existe encore et ce n'est pas cohérent.

Le code Hadoop à reproduire ressemble:

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

ligne de commande Je reproduis avec:

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

Si la raison est parce que les opérations de liste sont finalement cohérentes et la mise en œuvre de FileSystem est l'utilisation liste des opérations pour déterminer si la destination existe toujours, alors je comprends, et alors est-il une solution recommandée pour s'assurer que la destination n'existe plus avant de renommer?

Merci, Luc

Répondre

1

opérations de lecture après écriture (y compris supprimer) sont fortement en accord, donc par exemple, si vous avez fait:

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 

Ce serait toujours l'échec. Cependant, pour déterminer si un "répertoire" existe, gsutil doit effectuer une opération de listage cohérente afin de déterminer si un objet dans l'espace de noms de Google Cloud Storage a un préfixe avec le nom de ce "répertoire". Cela peut conduire au problème que vous avez décrit, et je m'attends à ce que le code hadoop se comporte de la même manière.

Il n'existe pas de solution de contournement fortement cohérente pour ce problème, car il n'existe aucun moyen de vérifier l'existence d'un préfixe de manière cohérente.

+0

Merci. Je pense que je vais redessiner le flux de données, donc je crée toujours un nouveau "répertoire" avec un horodatage dans le nom, plutôt que de tenter de remplacer un "répertoire" existant – lukeforehand