aws amazon-web-services amazon-s3 amazon-ec2 amazon-dynamodb amazon-redshift

amazon web services - aws - Cargando datos(incrementalmente) en Amazon Redshift, S3 vs DynamoDB vs Insert



aws database (5)

Aunque ya hay una respuesta aceptada aquí, AWS lanzó un nuevo servicio llamado Kinesis Firehose que maneja la agregación según los intervalos definidos por el usuario, una carga temporal a s3 y la carga (SAVE) a corrimiento al rojo, reintentos y manejo de errores, gestión de rendimiento, etc. ...

Esta es probablemente la forma más fácil y confiable de hacerlo.

Tengo una aplicación web que necesita enviar informes sobre su uso. Quiero utilizar Amazon RedShift como almacén de datos para tal fin. ¿Cómo debo recopilar los datos?

Cada vez que el usuario interactúa con mi aplicación, quiero informar que ... ¿cuándo debería escribir los archivos en S3? y cuántos ? Lo que quiero decir es: - Si no envío la información de inmediato, podría perderla como resultado de una conexión perdida, o de algún error en mi sistema mientras se recopilaba y prepararme para enviarla a S3 ... - Si escribo archivos en S3 en cada interacción del usuario, terminaré con cientos de archivos (en cada archivo tiene datos mínimos), que deben ser administrados, ordenados, eliminados después de haber sido copiados a RedShift ... esa dosis no parece una buena solución

¿Qué me estoy perdiendo? ¿Debo usar DynamoDB en su lugar? ¿Debo usar inserción simple en Redshift?
Si necesito escribir los datos en DynamoDB, ¿debo eliminar la tabla de retención después de haber sido copiada ... cuáles son las mejores prácticas?

En cualquier caso, ¿cuáles son las mejores prácticas para evitar la duplicación de datos en RedShift?

¡Aprecia la ayuda!


Puede escribir datos en un archivo CSV en el disco local y luego ejecutar la secuencia de comandos Python / boto / psycopg2 para cargar datos en Amazon Redshift.

En mi CSV_Loader_For_Redshift hago exactamente eso:

  1. Comprima y cargue datos en S3 utilizando el módulo boto Python y la carga de varias partes.

    conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) bucket = conn.get_bucket(bucket_name) k = Key(bucket) k.key = s3_key_name k.set_contents_from_file(file_handle, cb=progress, num_cb=20, reduced_redundancy=use_rr )

  2. Utilice el comando psycopg2 COPY para anexar datos a la tabla Redshift.

    sql=""" copy %s from ''%s'' CREDENTIALS ''aws_access_key_id=%s;aws_secret_access_key=%s'' DELIMITER ''%s'' FORMAT CSV %s %s %s %s;""" % (opt.to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.delim,quote,gzip, timeformat, ignoreheader)


Se prefiere agregar registros de eventos antes de injerirlos en Amazon Redshift.

Los beneficios son:

  • Usará mejor la naturaleza paralela de Redshift; COPY en un conjunto de archivos más grandes en S3 (o desde una gran tabla DynamoDB) será mucho más rápido que INSERT individual o COPY de un archivo pequeño.

  • Puede ordenar previamente sus datos (especialmente si la clasificación se basa en la hora del evento) antes de cargarlos en Redshift. Esto también mejora el rendimiento de la carga y reduce la necesidad de VACUUM en sus mesas.

Puede acumular sus eventos en varios lugares antes de agregarlos y cargarlos en Redshift:

  • Archivo local a S3 : la forma más común es agregar los registros en el cliente / servidor y cada x MB o minutos en subirlos a S3. Hay muchos apéndices de registro que admiten esta funcionalidad, y no es necesario realizar ninguna modificación en el código (por ejemplo, FluentD o Log4J ). Esto se puede hacer solo con la configuración del contenedor. El inconveniente es que corre el riesgo de perder algunos registros y estos archivos de registro locales se pueden eliminar antes de la carga.

  • DynamoDB : como describió @Swami, DynamoDB es una muy buena forma de acumular los eventos.

  • Amazon Kinesis : el servicio recientemente lanzado también es una buena manera de transmitir sus eventos desde los diversos clientes y servidores a una ubicación central de una manera rápida y confiable. Los eventos están en orden de inserción, lo que hace que sea más fácil cargarlo luego pre-clasificado en Redshift. Los eventos se almacenan en Kinesis durante 24 horas, y usted puede programar la lectura de kinesis y cargar a Redshift cada hora, por ejemplo, para un mejor rendimiento.

Tenga en cuenta que todos estos servicios ( S3, SQS, DynamoDB y Kinesis ) le permiten enviar los eventos directamente desde los usuarios / dispositivos finales, sin la necesidad de pasar por un servidor web intermedio. Esto puede mejorar significativamente la alta disponibilidad de su servicio (cómo manejar una mayor carga o falla del servidor) y el costo del sistema (usted solo paga por lo que usa y no necesita tener servidores infrautilizados solo para registros).

Vea, por ejemplo, cómo puede obtener tokens de seguridad temporales para dispositivos móviles aquí: http://aws.amazon.com/articles/4611615499399490

Otro conjunto importante de herramientas para permitir la interacción directa con estos servicios son los diversos SDK . Por ejemplo, para Java , .NET , JavaScript , iOS y Android .

En cuanto al requisito de deduplicación ; en la mayoría de las opciones anteriores, puede hacerlo en la fase de agregación; por ejemplo, cuando lee desde una transmisión de Kinesis, puede verificar que no haya duplicaciones en sus eventos, sino que analice un gran búfer de eventos antes de poner en el almacén de datos.

Sin embargo, puede hacer esta comprobación en Redshift también. Una buena práctica es COPY los datos en tablas de etapas y luego SELECCIONAR EN una tabla bien organizada y ordenada.

Otra práctica recomendada que puede implementar es tener una partición de tabla diaria (o semanal). Incluso si desea tener una gran tabla de eventos largos, pero la mayoría de sus consultas se ejecutan en un solo día (el último día, por ejemplo), puede crear un conjunto de tablas con una estructura similar (events_01012014, events_01022014, events_01032014 ...). Luego puede SELECT INTO ... WHERE date = ... a cada una de estas tablas. Cuando desee consultar los datos de varios días, puede usar UNION_ALL .


Simplemente soy un poco egoísta y describo exactamente lo que hace Snowplow , una plataforma de análisis de eventos. Usan esta forma única e increíble de recopilar registros de eventos del cliente y agregarlos en S3.

Usan Cloudfront para esto. Lo que puede hacer es alojar un píxel en uno de los intervalos de S3 y colocar ese depósito detrás de una distribución de CloudFront como origen. Habilite los registros en un depósito S3 para el mismo CloudFront.

Puede enviar registros como parámetros de URL cada vez que llame a ese píxel en su cliente (similar a Google Analytics). Estos registros se pueden enriquecer y agregar a la base de datos Redshift usando Copiar.

Esto resuelve el propósito de la agregación de registros. Esta configuración manejará todo eso por ti.

También puede consultar Piwik que es un servicio analítico de código abierto y ver si puede modificarlo específicamente según sus necesidades.


Una opción a considerar es crear tablas de series de tiempo en DynamoDB donde se crea una tabla todos los días o semanas en DynamoDB para escribir cada interacción del usuario. Al final del período de tiempo (día, hora o semana), puede copiar los registros en Redshift.

Para obtener más detalles, en la tabla de series temporales de DynamoDB, consulte este patrón: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.TimeSeriesDataAccessPatterns

y este blog:

http://aws.typepad.com/aws/2012/09/optimizing-provisioned-throughput-in-amazon-dynamodb.html

Para copia Redshift DynamoDB: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/RedshiftforDynamoDB.html

Espero que esto ayude.