2017-10-18 16 views
4

J'utilise le client de python google-cloud pour télécharger un fichier de Google Cloud Storage (GCS), obtenir l'erreur suivante:GCS - DataCorruption: incompatibilité checksum lors du téléchargement

File "/deploy/app/scanworker/storagehandler/gcshandler.py" line 62 in download_object 
blob.download_to_file(out_file) 

File "/usr/local/lib/python3.5/dist-packages/google/cloud/storage/blob.py" line 464 in download_to_file self._do_download(transport, file_obj, download_url, headers) 

File "/usr/local/lib/python3.5/dist-packages/google/cloud/storage/blob.py" line 418 in _do_download 
download.consume(transport) 

File "/usr/local/lib/python3.5/dist-packages/google/resumable_media/requests/download.py" line 169 in consume  

self._write_to_stream(result) 

File "/usr/local/lib/python3.5/dist-packages/google/resumable_media/requests/download.py" line 132 in _write_to_stream [args] [locals] 
raise common.DataCorruption(response, msg) 


DataCorruption: Checksum mismatch while downloading: 

https://www.googleapis.com/download/storage/v1/b/<my-bucket>/o/<my-object>?alt=media 

The X-Goog-Hash header indicated an MD5 checksum of: 

fdn2kKmS4J6LCN6gfmEUVQ== 

but the actual MD5 checksum of the downloaded contents was: 

C9+ywW2Dap0gEv5gHoR1UQ== 

J'utilise le code suivant pour télécharger le blob de GCS:

bucket_name = '<some-bucket>' 
service_account_key = '<path to json credential file>' 
with open(service_account_key, 'r') as f: 
    keyfile = json.load(f) 
    project_id = keyfile['project_id'] 

credentials = service_account.Credentials.from_service_account_file(service_account_key) 
client = storage.Client(project=project_id, 
         credentials=credentials) 
bucket = client.get_bucket(bucket_name) 

blob_name = '<name of blob>' 
download_path = "./foo.obj" 
blob = bucket.blob(blob_name) 
with open(download_path, "w") as out_file: 
    blob.download_to_file(out_file) # it fails here 

Quelques infos:

  • En utilisant python3
  • en cours d'exécution dans un Ubuntu 16.04 contenant Docker dans Kubernetes
  • en utilisant la version de la bibliothèque cliente google-Cloud 0.27.0 téléchargé avec pika

, je ne peux pas sembler aussi reproduire l'erreur sur mon ordinateur de bureau local, le téléchargement du mêmes fichiers qui ont échoué à partir de mon conteneur Docker.

Est-ce une erreur avec la bibliothèque cliente? Ou pourrait-il être un problème de réseau? Essayé de télécharger des fichiers différents, tous donnant la même erreur de Kubernetes. Le même code a fonctionné pendant des mois sans problème, voyant seulement cette erreur maintenant.

Edit:

Reconstruction du conteneur Docker du même code que semble avant d'avoir résolu le problème. Je suis toujours curieux de savoir ce qui a causé l'erreur en premier lieu.

Édition 2: Nous utilisons circleci pour déployer la webapp en production. Maintenant, il semble que l'image construite sur circleci échoue, alors que la construction localement semble fonctionner. Comme il est contenu dans un conteneur Docker, c'est vraiment bizarre, peu importe d'où nous le construisons?

Edit 3: Se connecter en même récipient dans Kubernetes donnant l'erreur ci-dessus, j'ai essayé de courir gsutil cp gs:/<bucket>/<blob-name> foo.obj Ce couru sans aucun problème

+2

L'objet que vous téléchargez a-t-il son encodage de contenu défini sur gzip? Si tel est le cas, il s'agit d'un changement récent apporté à la bibliothèque google-cloud-resumable-media, pour ajouter un contrôle de checksum (mais qui contrôle actuellement le contenu gunzip, alors que le service envoie la somme de contrôle pour le contenu gzip). Nous travaillons sur un correctif maintenant. –

+0

@MikeSchwartz: J'utilise la même bibliothèque google.cloud.storage i.e google-cloud == 0.25.0 dans une application de moteur d'application. J'ai également ajouté google-resumable-media == 0.2.3 à ma liste de dépendances à déployer sur le moteur de l'application. –

+0

@MikeSchwartz: Chaque fois que l'application essaie de télécharger un fichier de plus de 32 Mo, j'obtiens la même erreur DataCorruption: Checksum lors du téléchargement: erreur . Je comprends que les fichiers de plus de 32 Mo ne peuvent pas être traités dans le moteur de l'application. cela signifie-t-il que la librairie de stockage essaye en interne de gziper des fichiers de plus de 32 Mo et que je rencontre donc l'erreur de comparaison de checksum? c'est ce que im faire: client = storage.Client (projet = 'myproj') seau = client.get_bucket (bucket_name) blob = Blob (nom_fichier, seau) file = blob.download_as_string() –

Répondre

1

Comme indiqué dans le commentaire de Mike: Ce fut un problème avec la version 0.3.0 de la bibliothèque google-resumable-media. (Voir le problème ici: https://github.com/GoogleCloudPlatform/google-resumable-media-python/issues/34)

En spécifiant google-resumable-media==0.2.3 dans notre pip requirements.txt a fait le travail!

La raison pour laquelle l'erreur n'apparaissait pas dans l'image Docker créée à partir de mon bureau était que j'avais des images en cache avec l'ancienne version de google-resumable-media.

+0

Cela a fonctionné pour moi et mon laboratoire aussi. Merci! – SapphireSun

+1

Je crois que le librayr est Google-resumable-media et non Google-cloud * -resumable-media? –

+0

@PrasaanthNeelakandan vous avez raison, l'a réparé maintenant. –