GCS - DataCorruption:校验错配,同时下载
我使用python的google-cloud
客户端下载从谷歌云存储(GCS)的文件,得到以下错误:GCS - DataCorruption:校验错配,同时下载
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==
我用下面的代码下载从GCS BLOB:
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
一些信息:
- 使用python3
- 使用与鼠
还下载了谷歌云客户端库版本0.27.0在Kubernetes
这是客户端库的错误吗?或者它可能是一个网络问题? 尝试下载不同的文件,所有文件都给出了来自Kubernetes的相同错误。相同的代码已经运行好几个月没有问题,现在只能看到这个错误。
编辑:
重建是完全相同的代码泊坞窗容器,似乎之前已经解决了这一问题。尽管如此,我仍然对导致错误的原因感到好奇。
编辑2: 我们使用circleci将webapp部署到生产环境。现在看起来像circleci上的图像失败了,而在本地构建它似乎工作。既然它包含在一个Docker容器中,这真的很奇怪,应该不是我们从哪里构建的?
编辑3: 登录到在kubernetes给上述错误非常相同的容器,我试图运行gsutil cp gs:/<bucket>/<blob-name> foo.obj
此运行,没有任何问题
正如迈克评论指出:这是一个与google-resumable-media
库0.3.0版问题。 (见问题在这里:https://github.com/GoogleCloudPlatform/google-resumable-media-python/issues/34)
指定google-resumable-media==0.2.3
在我们的点requirements.txt
做的工作!
从我的桌面构建的Docker镜像中没有出现错误的原因是我使用旧版本google-resumable-media
缓存了图像。
这对我和我的实验室也是如此。谢谢! – SapphireSun
我相信librayr是google-resumable-media,而不是google-cloud * -resumable-media? –
@PrasaanthNeelakandan你是对的,现在就修好它。 –
您下载的对象是否将其内容编码设置为gzip?如果是这样,这是我们对google-cloud-resumable-media库进行的最近更改中的一个问题,可以添加校验和支持(但是当前校验和是gunzipped内容,而服务将为gzip内容发送校验和)。我们现在正在修复一个修复程序。 –
@MikeSchwartz:我在应用程序引擎应用程序中使用相同的库google.cloud.storage,即google-cloud == 0.25.0。我还将google-resumable-media == 0.2.3添加到我的依赖列表中以部署在应用引擎上。 –
@MikeSchwartz:每当应用程序尝试下载大于32 MB的文件时,我都会得到相同的DataCorruption:下载时校验和不匹配: 错误。 我了解大于32 MB的文件无法在应用程序引擎中处理。这是否意味着存储库在内部尝试gzip大于32MB的文件,因此我遇到校验和比较错误?这是我即将做的:client = storage.Client(project ='myproj') bucket = client.get_bucket(bucket_name) blob = Blob(file_name,bucket) file = blob.download_as_string() –