【问题标题】:s3cmd failed too many timess3cmd 失败太多次
【发布时间】:2011-08-12 02:25:29
【问题描述】:

我曾经是一个快乐的 s3cmd 用户。但是最近当我尝试将一个大的 zip 文件 (~7Gig) 传输到 Amazon S3 时,我收到了这个错误:

$> s3cmd put thefile.tgz s3://thebucket/thefile.tgz

....
  20480 of 7563176329     0% in    1s    14.97 kB/s  failed
WARNING: Upload failed: /thefile.tgz ([Errno 32] Broken pipe)
WARNING: Retrying on lower speed (throttle=1.25)
WARNING: Waiting 15 sec...
thefile.tgz -> s3://thebucket/thefile.tgz  [1 of 1]
       8192 of 7563176329     0% in    1s     5.57 kB/s  failed
ERROR: Upload of 'thefile.tgz' failed too many times. Skipping that file.

我使用的是最新的s3cmd on Ubuntu

为什么会这样?我该如何解决?如果无法解决,我可以使用什么替代工具?

【问题讨论】:

  • 请注意,如果发生这种情况,s3cmd s3cmd put 返回0(甚至可能是后面的版本)。永远不要相信 s3cmd 进行关键操作。
  • @AnttiHaapala 你会推荐什么替代 s3cmd?

标签: file-upload ubuntu amazon-s3 backup


【解决方案1】:

现在在 2014 年,aws cli 能够代替 s3cmd 上传大文件。

http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html 有安装/配置说明,或者经常:

$ wget https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
$ aws configure

紧随其后

$ aws s3 cp local_file.tgz s3://thereoncewasans3bucket

会给您带来满意的结果。

【讨论】:

  • +1 !我有一个 110GB 的文件需要持续备份,部分备份太糟糕了。上面的解决方案很棒!
  • 我刚刚花了大约一个小时与 AWS 支持人员聊天,他们实际上在这篇 SO 文章中与我聊天!即使我的文件
【解决方案2】:

我自己也遇到过这个问题。我有一个 24GB 的 .tar.gz 文件要放入 S3。

上传较小的片段会有所帮助。

还有 ~5GB 的文件大小限制,所以我将文件分成几部分,以后下载这些部分时可以重新组合。

split -b100m ../input-24GB-file.tar.gz input-24GB-file.tar.gz-

该行的最后一部分是“前缀”。拆分将附加“aa”、“ab”、“ac”等。 -b100m 表示 100MB 块。一个 24GB 的文件最终会包含大约 240 个 100mb 的部分,称为 'input-24GB-file.tar.gz-aa' 到 'input-24GB-file.tar.gz-jf'。

若要稍后合并它们,请将它们全部下载到一个目录中,然后:

cat input-24GB-file.tar.gz-* > input-24GB-file.tar.gz

获取原始文件和拆分文件的 md5sums 并将其存储在 S3 存储桶中,或者更好,如果它不是那么大,使用像 parchive 这样的系统能够检查,甚至修复一些下载问题也可能很有价值.

【讨论】:

  • 谢谢阿利斯特。我不知道 ~5Gig 文件大小限制。所以 s3cmd 没问题 :)
  • 我认为这是 s3cmd 的限制,因为亚马逊允许文件数 TB。
  • 文件太大可能是原因之一。但是我遇到了小到 100MB 的文件的问题。
  • 一切都与网络有关。在 AWS 上,问题通常较少,但在本地网络之外,所有的赌注都没有了。您可能希望将文件拆分得更小。
  • 目前,S3 接受最大 5 TB 的文件,但只能接受最大 5 GB 的单次上传。较大的需要分段上传。 aws.amazon.com/s3/faqs/#How_much_data_can_I_store
【解决方案3】:

我尝试了所有其他答案,但都没有奏效。看起来 s3cmd 相当敏感。 就我而言,s3 存储桶位于欧盟。小文件会上传,但当它达到约 60k 时,它总是失败。

当我更改 ~/.s3cfg 时,它起作用了。

以下是我所做的更改:

host_base = s3-eu-west-1.amazonaws.com

host_bucket = %(bucket)s.s3-eu-west-1.amazonaws.com

【讨论】:

  • 谢谢。今天它救了我的命
  • 太棒了。你也拯救了我的一天。
  • 你拯救了我的一天!谢谢!
  • bucket_location = eu-west-1
【解决方案4】:

我在使用 ubuntu s3cmd 时遇到了同样的问题。

s3cmd --guess-mime-type --acl-public put test.zip s3://www.jaumebarcelo.info/teaching/lxs/test.zip
test.zip -> s3://www.jaumebarcelo.info/teaching/lxs/test.zip  [1 of 1]
 13037568 of 14456364    90% in  730s    17.44 kB/s  failed
WARNING: Upload failed: /teaching/lxs/test.zip (timed out)
WARNING: Retrying on lower speed (throttle=0.00)
WARNING: Waiting 3 sec...
test.zip -> s3://www.jaumebarcelo.info/teaching/lxs/test.zip  [1 of 1]
  2916352 of 14456364    20% in  182s    15.64 kB/s  failed
WARNING: Upload failed: /teaching/lxs/test.zip (timed out)
WARNING: Retrying on lower speed (throttle=0.01)
WARNING: Waiting 6 sec...

解决方案是使用 instructions from s3tools.org 更新 s3cmd:

Debian 和 Ubuntu

我们的 DEB 存储库是在最兼容的环境中精心创建的 方式 – 它应该适用于 Debian 5 (Lenny)、Debian 6 (Squeeze)、Ubuntu 10.04 LTS (Lucid Lynx) 和所有更新的,可能还有一些旧的 Ubuntu 版本。从命令行执行以下步骤:

  • 导入 S3tools 签名密钥:

    wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | sudo apt-key add -

  • 将 repo 添加到 sources.list:

    sudo wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list

  • 刷新包缓存并安装最新的s3cmd:

    sudo apt-get update && sudo apt-get install s3cmd

【讨论】:

  • 把链接的内容复制到这里,留下链接作为参考。
  • 我已尝试按照原始页面说明进行更新,但 24GB 文件仍然失败,而 1GB 文件有效。尝试其他解决方案。
  • 如果这不起作用,请从 tar 包安装。 sourceforge.net/projects/s3tools/files/s3cmd/1.1.0-beta2/…
  • 确实,它对我不起作用。它更新到 1.0.x 但有同样的问题。正如@user1681360 建议的那样,构建 tarball (v 1.5.x) 解决了这个问题(它使用多部分上传)。
  • 我在上传 38MB 文件时遇到了这个问题,因为我使用的是带宽有限的 t1.micro 实例 - 更改为 m1-medium 实例解决了这个问题。
【解决方案5】:

当亚马逊返回错误时会发生此错误:他们似乎随后断开套接字以阻止您上传千兆字节的请求以返回“不,失败”作为响应。这就是为什么有些人会因为时钟偏差而得到它,有些人会因为策略错误而得到它,还有一些人会遇到大小限制,需要使用多部分上传 API。并不是每个人都错了,或者甚至在关注不同的问题:这些都是 s3cmd 中相同潜在行为的不同症状。

由于大多数错误条件将是确定性的,s3cmd 丢弃错误消息并重试较慢的行为是一种疯狂的不幸:(。然后要获得实际的错误消息,您可以进入 /usr/share/s3cmd /S3/S3.py(记得删除对应的.pyc,以便使用更改)并在send_file函数的except Exception, e:块中添加print e

就我而言,我试图将上传文件的 Content-Type 设置为“application/x-debian-package”。显然,s3cmd 的 S3.object_put 1) 不遵守通过 --add-header 传递的 Content-Type 并且 2) 未能覆盖通过 --add-header 添加的 Content-Type,因为它将标头存储在带有大小写的字典中 -敏感键。结果是它使用其“内容类型”的值进行签名计算,然后最终(至少有很多请求;这可能基于某处的某种哈希排序)向亚马逊发送“内容类型”,导致签名错误。

在我今天的具体情况下,似乎 -M 会导致 s3cmd 猜测正确的 Content-Type,但它似乎仅基于文件名来做到这一点......我希望它会使用基于 mimemagic 数据库关于文件的内容。不过,老实说:s3cmd 在上传文件失败时甚至无法返回失败的 shell 退出状态,因此结合所有这些其他问题,最好只编写自己的一次性工具来完成一个你需要的东西......几乎可以肯定的是,当你被这个工具的某些角落咬伤时,它最终会为你节省时间:(。

【讨论】:

  • 感谢您明确指出 s3cmd 不如他的受欢迎程度让我相信。现在使用aws s3 cp
【解决方案6】:

s3cmd 1.0.0 还不支持多部分。我尝试了 1.1.0-beta,它工作得很好。您可以在此处阅读有关新功能的信息:http://s3tools.org/s3cmd-110b2-released

【讨论】:

  • 我希望我能更多地支持它:这是解决 Alister Bulman 所描述问题的最简单的方法(不是 Jaume Barcelo、qliq 或其他人所描述的问题)。 s3cmd-1.1.0-betaX(撰写本文时为beta3)不仅会为您拆分和上传,还会要求亚马逊重新组合文件,以便它们在 S3 上显示为一个文件。 这是必不可少的,如果您要在 Elastic Map-Reduce 中使用它,您无法使用 cat 手动重新组合它们。
【解决方案7】:

在我的情况下,失败的原因是服务器的时间领先于 S3 时间。因为我在我的服务器(位于美国东部)中使用了 GMT+4,并且我使用的是亚马逊的美国东部存储设施。

将我的服务器调整为美国东部时间后,问题就消失了。

【讨论】:

    【解决方案8】:

    我遇到了同样的问题,结果证明bucket_location 中的~/.s3cfg 值不正确。

    这篇博文引导我找到答案。

    如果您要上传到的存储桶不存在(或者您错过了输入它),它将失败并显示该错误。谢谢你的一般错误信息。 - 查看更多信息:http://jeremyshapiro.com/blog/2011/02/errno-32-broken-pipe-in-s3cmd/#sthash.ZbGwj5Ex.dpuf

    在检查了我的~/.s3cfg 后发现它有:

    bucket_location = Sydney
    

    而不是:

    bucket_location = ap-southeast-2
    

    更正此值以使用 proper 名称解决了该问题。

    【讨论】:

    • 这里相同 - 必须将 bucket_location = EU 更改为 bucket_location = eu-west-1
    【解决方案9】:

    对我来说,以下工作:

    在 .s3cfg 中,我更改了 host_bucket

    host_bucket = %(bucket)s.s3-external-3.amazonaws.com
    

    【讨论】:

    • 此问题与存储桶无关,而是与存储桶的 DNS 传播有关。
    【解决方案10】:

    s3cmd 1.1.0-beta3 或更高版本将自动使用multipart uploads 允许发送任意大的文件 (source)。您也可以控制它使用的块大小。例如

    s3cmd --multipart-chunk-size-mb=1000 put hugefile.tar.gz s3://mybucket/dir/
    

    这将以 1 GB 块进行上传。

    【讨论】:

      【解决方案11】:

      我遇到了与错误设置安全组策略相同的管道损坏错误。我责怪 S3 文档。

      我在博客中写过how to set the policy correctly,即:

      {
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "s3:ListBucket",
              "s3:GetBucketLocation",
              "s3:ListBucketMultipartUploads"
            ],
            "Resource": "arn:aws:s3:::example_bucket",
            "Condition": {}
          },
          {
            "Effect": "Allow",
            "Action": [
              "s3:AbortMultipartUpload",
              "s3:DeleteObject",
              "s3:DeleteObjectVersion",
              "s3:GetObject",
              "s3:GetObjectAcl",
              "s3:GetObjectVersion",
              "s3:GetObjectVersionAcl",
              "s3:PutObject",
              "s3:PutObjectAcl",
              "s3:PutObjectAclVersion"
            ],
            "Resource": "arn:aws:s3:::example_bucket/*",
            "Condition": {}
          }
        ]
      }
      

      【讨论】:

        【解决方案12】:

        就我而言,我已经解决了这个问题,只是添加了正确的权限。

        Bucket > Properties > Permissions 
        "Authenticated Users"
        - List
        - Upload/Delete
        - Edit Permissions
        

        【讨论】:

          【解决方案13】:

          我遇到了一个类似的错误,最终证明是由机器上的时间漂移​​引起的。正确设置时间为我解决了这个问题。

          【讨论】:

            【解决方案14】:

            搜索.s3cfg 文件,通常在您的主文件夹中。

            如果你有它,你就得到了恶棍。更改以下两个参数应该会对您有所帮助。

            socket_timeout = 1000
            multipart_chunk_size_mb = 15
            

            【讨论】:

              【解决方案15】:

              我通过不使用 s3cmd 解决了这个问题。相反,我在 python 项目S3-Multipart on GitHub 上取得了巨大的成功。它会上传和下载,并根据需要使用尽可能多的线程。

              【讨论】:

              • 不知道为什么我被否决了——不发表评论真的很有成效——但我会注意到我停止使用这个项目,这可能在某一时刻给了我一些损坏的数据,我只是使用AWS CLI 独占。
              猜你喜欢
              • 2017-02-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多