s3cmd слишком много раз терпел неудачу

46

Раньше я был счастливым пользователем 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 на Ubuntu.

Почему так? и как я могу его решить? Если это неразрешимо, какой альтернативный инструмент я могу использовать?

  • 1
    Помните, что если это произойдет, s3cmd <= 1.5.0 также может вернуть 0 из s3cmd put в код возврата (возможно, даже в последних версиях). Никогда не доверяйте s3cmd для критических операций.
  • 2
    @AnttiHaapala Какую альтернативу вы бы порекомендовали вместо s3cmd?
Теги:
amazon-s3
file-upload
backup

15 ответов

4
Лучший ответ

В моем случае причиной отказа было время сервера, превышающее время S3. Поскольку я использовал GMT + 4 на своем сервере (расположенный на востоке США), и я использовал Amazon US East хранилище.

После настройки моего сервера на восточное время в США проблема исчезла.

53

И теперь, в 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

даст вам удовлетворительные результаты.

  • 0
    +1! У меня есть файл на 110 ГБ, который мне нужно было сделать на постоянной основе, делать это по частям ужасно. Вышеуказанное решение великолепно!
  • 0
    Я просто потратил около часа в чате с поддержкой AWS, и они на самом деле рассказали мне эту ТАКУЮ статью! Несмотря на то, что мои файлы были <100Mb, и эта ошибка просто возникла из ниоткуда ... Установка CLI AWS и переключение на эту проблему решило проблему.
29

Я сам столкнулся с этой проблемой. У меня есть файл 24g.tar.gz для размещения в S3.

Загрузка меньших частей поможет.

Также существует ограничение размера файла ~ 5 ГБ, поэтому я разбиваю файл на куски, который можно повторно собрать, когда фрагменты будут загружены позже.

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

Последняя часть этой строки является "префиксом". Split добавит "aa", "ab", "ac" и т.д. К нему. -b100m означает 100 МБ кусков. 24-гигабайтный файл будет содержать около 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, чтобы иметь возможность проверить, даже исправить некоторые проблемы с загрузкой также могут быть полезными.

  • 1
    Спасибо Алистер. Я не знал о пределе размера файла ~ 5Gig. Так что нет проблем с s3cmd :)
  • 4
    Я полагаю, что это ограничение s3cmd, так как Amazon имеет файлы размером несколько терабайт.
Показать ещё 4 комментария
14

Я пробовал все остальные ответы, но никто не работал. Похоже, s3cmd довольно чувствителен. В моем случае ведро s3 находилось в ЕС. Маленькие файлы будут загружаться, но когда он дошел до ~ 60k, он всегда терпел неудачу.

Когда я изменил файл ~/.s3cfg, он сработал.

Вот изменения, которые я сделал:

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

host_bucket =% (ведро) s.s3-eu-west-1.amazonaws.com

  • 0
    Благодарю. Это спасло мне жизнь сегодня
  • 0
    Добро пожаловать Salwek, спасибо, что сообщили мне знать.
Показать ещё 4 комментария
10

У меня была такая же проблема с 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...

Решением было обновление s3cmd с помощью инструкций из s3tools.org:

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

  • 2
    скопируйте содержимое ссылки сюда, оставьте ссылку как ссылку.
  • 0
    Я пытался обновить с оригинальной страницы инструкции, но все равно с файлом 24GB не удается, в то время как файл 1GB работает. Пробую другие решения.
Показать ещё 4 комментария
6

Эта ошибка возникает, когда Amazon возвращает ошибку: они, похоже, отключают сокет, чтобы вы не загружали гигабайты запроса, чтобы получить ответ "нет, это не удалось" в ответ. Вот почему некоторые люди получают это из-за перекоса часов, некоторые люди получают его из-за ошибок политики, а другие сталкиваются с ограничениями по размеру, требующим использования API загрузки с несколькими частями. Дело не в том, что все ошибаются или даже смотрят на разные проблемы: это все разные симптомы одного и того же основного поведения в s3cmd.

Поскольку большинство условий ошибки будут детерминированными, поведение s3cmd отбрасывания сообщения об ошибке и медленного повторения выглядит сумасшедшим неудачным:(.then. Чтобы получить фактическое сообщение об ошибке, вы можете перейти в /usr/share/s 3cmd/S3/S3.py(помня, что нужно удалить соответствующий .pyc, чтобы изменения были использованы) и добавить print e в блок send_file except Exception, e:.

В моем случае я пытался установить Content-Type загруженного файла в "application/x-debian-package". По-видимому, s3cmd S3.object_put 1) не соблюдает Content-Type, переданный через --add-header, но 2) не может перезаписать Content-Type, добавленный через --add-header, поскольку он хранит заголовки в словаре с case- чувствительных клавиш. Результатом является то, что он выполняет подсчет подписи с использованием значения "тип контента" и затем заканчивается (по крайней мере, с множеством запросов, это может быть основано на каком-то порядке хэширования), отправляя "Content-Type" в Amazon, что приводит к ошибке подписи.

В моем конкретном случае сегодня кажется, что -M приведет к тому, что s3cmd угадает правильный Content-Type, но, похоже, это делается на основе имени файла... Я бы надеялся, что он будет использовать базу данных на основе mimemagic на содержимое файла. Честно говоря, s3cmd даже не может вернуть статус выхода из строя, когда он не может загрузить файл, поэтому в сочетании со всеми этими другими проблемами, вероятно, лучше просто написать собственный одноразовый инструмент, чтобы сделать один вещь, в которой вы нуждаетесь... почти наверняка, что в конечном итоге это сэкономит вам время, когда вас укусит какой-нибудь угловой случай этого инструмента: (.

  • 0
    Спасибо, что дали понять, что s3cmd не так хорош, как его популярность заставила меня поверить. Используя aws s3 cp сейчас.
5

s3cmd 1.0.0 еще не поддерживает многопоточность. Я пробовал 1.1.0-бета, и все работает отлично. Вы можете прочитать о новых функциях здесь: http://s3tools.org/s3cmd-110b2-released

  • 1
    Хотелось бы, чтобы я высказался об этом больше: это самое простое решение проблемы, описанной Алистером Булманом (а не проблемы, описанные Жауме Барсело, qliq или другими). s3cmd-1.1.0-betaX ( beta3 на момент написания статьи) не только выполняет разбиение и загрузку, но и просит Amazon повторно объединить файлы, чтобы они отображались в S3 как один файл. ЭТО ВАЖНО, если вы собираетесь использовать его в Elastic Map-Reduce, где у вас нет возможности рекомбинировать их вручную с помощью cat .
4

У меня возникла такая же проблема, она оказалась плохим значением bucket_location в ~/.s3cfg.

Это сообщение в блоге привело меня к ответу.

Если bucket youre uploading to does not exist (или вы пропустили его набрав), itll завершится с ошибкой. Спасибо, общее сообщение об ошибке. - См. Больше на: http://jeremyshapiro.com/blog/2011/02/errno-32-broken-pipe-in-s3cmd/#sthash.ZbGwj5Ex.dpuf

После проверки моего ~/.s3cfg видно, что у него было:

bucket_location = Sydney

Вместо

bucket_location = ap-southeast-2

Исправление этого значения для использования надлежащего имени (ов) решило проблему.

  • 0
    То же самое здесь - пришлось изменить bucket_location = EU на bucket_location = eu-west-1
2

Для меня работало:

В .s3cfg, я изменил host_bucket

host_bucket = %(bucket)s.s3-external-3.amazonaws.com
  • 0
    Спасибо, у меня тоже сработало.
  • 0
    Эта проблема была связана не с корзиной, а с ее распространением в DNS.
1

s3cmd версия 1.1.0-beta3 или выше автоматически будет использовать multipart uploads, чтобы разрешить отправку произвольно больших файлов (источник). Вы также можете контролировать размер куска, который он использует. например.

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

Это сделает загрузку в 1 ГБ фрагментов.

0

Найдите .s3cfg файл, как правило, в вашей домашней папке.

Если у вас есть это, вы получите злодея. Изменение двух следующих параметров должно помочь вам.

socket_timeout = 1000
multipart_chunk_size_mb = 15
0

Я столкнулся с аналогичной ошибкой, которая в конечном итоге оказалась вызвана временным дрейфом на машине. Правильно установите время для исправления проблемы.

0

В моем случае я исправил это, просто добавив права.

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

Я столкнулся с той же ошибкой, что и ошибка группы безопасности, так как политика безопасности была установлена ​​неправильно. Я обвиняю документацию S3.

Я писал о как правильно настроить политику в своем блоге, который:

{
  "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": {}
    }
  ]
}
-1

Я обратился к этому просто не используя s3cmd. Вместо этого у меня был большой успех с проектом python, S3-Multipart на GitHub. Он загружает и загружает, а также использует столько потоков, сколько требуется.

  • 0
    Не уверен, почему я получил отрицательное голосование - действительно продуктивно, чтобы не комментировать - но я отмечу, что я прекратил использовать этот проект, который, возможно, однажды дал мне некоторые поврежденные данные, и я просто использую исключительно CLI AWS.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню