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
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. –
@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. –
@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() –