2017-10-18 81 views
4

我使用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

  • 在Ubuntu的16.04泊坞容器中运行,我似乎无法重现我的本地桌面上的错误,在下载从我的Docker容器中失败的相同文件。

    这是客户端库的错误吗?或者它可能是一个网络问题? 尝试下载不同的文件,所有文件都给出了来自Kubernetes的相同错误。相同的代码已经运行好几个月没有问题,现在只能看到这个错误。

    编辑:

    重建是完全相同的代码泊坞窗容器,似乎之前已经解决了这一问题。尽管如此,我仍然对导致错误的原因感到好奇。

    编辑2: 我们使用circleci将webapp部署到生产环境。现在看起来像circleci上的图像失败了,而在本地构建它似乎工作。既然它包含在一个Docker容器中,这真的很奇怪,应该不是我们从哪里构建的?

    编辑3: 登录到在kubernetes给上述错误非常相同的容器,我试图运行gsutil cp gs:/<bucket>/<blob-name> foo.obj 此运行,没有任何问题

  • +2

    您下载的对象是否将其内容编码设置为gzip?如果是这样,这是我们对google-cloud-resumable-media库进行的最近更改中的一个问题,可以添加校验和支持(但是当前校验和是gunzipped内容,而服务将为gzip内容发送校验和)。我们现在正在修复一个修复程序。 –

    +0

    @MikeSchwartz:我在应用程序引擎应用程序中使用相同的库google.cloud.storage,即google-cloud == 0.25.0。我还将google-resumable-media == 0.2.3添加到我的依赖列表中以部署在应用引擎上。 –

    +0

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

    回答

    1

    正如迈克评论指出:这是一个与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缓存了图像。

    +0

    这对我和我的实验室也是如此。谢谢! – SapphireSun

    +1

    我相信librayr是google-resumable-media,而不是google-cloud * -resumable-media? –

    +0

    @PrasaanthNeelakandan你是对的,现在就修好它。 –