La forma más rápida de descargar 3 millones de objetos de un cubo S3


He intentado usar Python + boto + multiprocesamiento, S3cmd y J3tset pero luchando con todos ellos.

¿Alguna sugerencia, tal vez un script ya hecho que hayas estado usando u otra forma que desconozco?

EDITAR:

Eventlet+boto es una solución que vale la pena como se menciona a continuación. Encontré un buen artículo de referencia de eventlet aquí http://web.archive.org/web/20110520140439/http://teddziuba.com/2010/02/eventlet-asynchronous-io-for-g.html

He añadido el script python que estoy usando ahora mismo a continuación.

Author: Imran, 2011-01-18

2 answers

De acuerdo, descubrí una solución basada en la sugerencia de @Matt Billenstien. Utiliza la biblioteca eventlet. El primer paso es el más importante aquí (parcheo de mono de bibliotecas de IO estándar).

Ejecute este script en segundo plano con nohup y estará listo.

from eventlet import *
patcher.monkey_patch(all=True)

import os, sys, time
from boto.s3.connection import S3Connection
from boto.s3.bucket import Bucket

import logging

logging.basicConfig(filename="s3_download.log", level=logging.INFO)


def download_file(key_name):
    # Its imp to download the key from a new connection
    conn = S3Connection("KEY", "SECRET")
    bucket = Bucket(connection=conn, name="BUCKET")
    key = bucket.get_key(key_name)

    try:
        res = key.get_contents_to_filename(key.name)
    except:
        logging.info(key.name+":"+"FAILED")

if __name__ == "__main__":
    conn = S3Connection("KEY", "SECRET")
    bucket = Bucket(connection=conn, name="BUCKET")

    logging.info("Fetching bucket list")
    bucket_list = bucket.list(prefix="PREFIX")

    logging.info("Creating a pool")
    pool = GreenPool(size=20)

    logging.info("Saving files in bucket...")
    for key in bucket.list():
        pool.spawn_n(download_file, key.key)
    pool.waitall()
 30
Author: Jagtesh Chadha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-18 13:02:59

Use eventlet para darle paralelismo de E/S, escriba una función simple para descargar un objeto usando urllib, luego use un GreenPile para mapearlo a una lista de urls de entrada a una pila con 50 a 100 greenlets debería hacer...

 4
Author: Matt Billenstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-18 05:43:54