Le chargement de données (progressivement) dans Amazon Redshift, S3 vs DynamoDB vs Insérer
J'ai une application web qui doit envoyer des rapports sur son utilisation, je veux utiliser Amazon RedShift comme un entrepôt de données à cette fin,
Comment collecter les données ?
À chaque fois, l'utilisateur d'interagir avec l'une de mes applications, je tiens à signaler que.. donc quand dois-je écrire les fichiers de S3 ? et de combien ?
Ce que je veux dire, c'est:
- Si l'option ne pas envoyer l'info tout de suite, je risque de perdre à la suite d'une perte de connexion, ou d'un bug dans mon système, tandis que sa été recueillies et préparez-vous à être envoyé à S3...
- Si je dois écrire des fichiers de S3 sur chaque interaction de l'utilisateur, je vais finir avec des centaines de fichiers (sur chaque fichier a un minimum de données), qui doivent être gérés, triés, supprimé après avoir été copié à RedShift.. que la dose ne semble être une bonne solution .
Ce qui me manque? Dois-je utiliser DynamoDB au lieu de cela, dois-je utiliser simple insertion dans Redshift à la place !?
Si j'ai besoin d'écrire les données sur DynamoDB, dois-je supprimer l'emprise de la table après avoir été copié .. quelles sont les meilleures pratiques ?
Sur tout cas ce que sont les meilleures pratiques pour éviter la duplication des données dans le RedShift ?
Apprécions l'aide!
Vous devez vous connecter pour publier un commentaire.
Il est préférable de globale journaux d'événements avant de l'ingérer dans Amazon Redshift.
Les avantages sont:
Vous utilisez la parallèle nature de Redshift mieux; COPIE sur un ensemble de fichiers de grande taille en S3 (ou à partir d'une grande table DynamoDB) sera beaucoup plus rapide que personne d'INSÉRER ou de COPIE d'un fichier de petite taille.
Vous pouvez pré-tri vos données (en particulier, si le tri est basé sur la durée de l'événement) avant de les charger dans Redshift. C'est aussi améliorer vos performances de chargement et de réduire le besoin de VIDE de vos tables.
Vous pouvez accumuler vos événements dans plusieurs endroits avant de les agréger et de les charger dans des Redshift:
Fichier Local à S3 - la façon la plus commune est de regrouper vos journaux sur le client/serveur et tous les x MO ou y minutes télécharger sur S3. Il y a beaucoup de journaux appenders qui prennent en charge cette fonctionnalité, et vous n'avez pas besoin de faire des modifications dans le code (par exemple, FluentD ou Log4J). Cela peut être fait avec le conteneur de configuration. L'inconvénient est que vous risquez de perdre certains journaux et ces fichiers journaux locaux peuvent être supprimés avant de le télécharger.
DynamoDB - comme @Swami décrit, DynamoDB est une très bonne façon d'accumuler les événements.
Amazon Kinesis - le récemment publié le service est également un bon moyen de diffuser vos événements à partir de différents clients et les serveurs d'un emplacement central dans une façon rapide et fiable. Les événements sont dans l'ordre d'insertion, ce qui le rend facile à charger le pré-triés de Redshift. Les événements sont stockés dans le Kinesis pour 24 heures, et vous pouvez programmer la lecture de kinesis et le chargement de Redshift toutes les heures, par exemple, pour de meilleures performances.
Veuillez noter que tous ces services (S3, SQS, DynamoDB et Kinesis) vous permettent de pousser les événements directement à partir de la fin les utilisateurs/appareils, sans avoir besoin de passer par l'intermédiaire d'un moyen de serveur web. Cela peut améliorer considérablement la haute disponibilité de votre service (comment gérer l'augmentation de la charge ou de panne de serveur) et le coût du système (vous ne payez que pour ce que vous utilisez et que vous n'avez pas besoin d'avoir des serveurs sous-utilisés seulement pour les journaux).
Voir, par exemple, la façon dont vous pouvez obtenir temporaire des jetons de sécurité pour les appareils mobiles ici: http://aws.amazon.com/articles/4611615499399490
Un autre ensemble important d'outils permettant une interaction directe avec ces services sont les différents SDKs. Par exemple pour Java, .NET, JavaScript, iOS et Android.
Concernant la de-duplication exigence; dans la plupart des options ci-dessus, vous pouvez le faire dans la phase d'agrégation, par exemple, lorsque vous lisez à partir d'un flux Kinesis, vous pouvez vérifier que vous n'avez pas de duplications dans vos événements, mais l'analyse d'un grand tampon des événements avant de les mettre dans la banque de données.
Cependant, vous pouvez faire cette vérification dans Redshift ainsi. Une bonne pratique est de
COPY
les données dans une mise en scène de tables et puis SÉLECTIONNEZ DANS bien organisée et tableau trié.Une autre des meilleures pratiques que vous pouvez mettre en œuvre est d'avoir un quotidien (ou hebdomadaire) de la table de partition. Même si vous voulez avoir une grande table des événements, mais la majorité de vos requêtes sont en cours d'exécution sur une seule journée (le dernier jour, par exemple), vous pouvez créer un ensemble de tables avec structure similaire (events_01012014, events_01022014, events_01032014...). Ensuite, vous pouvez
SELECT INTO ... WHERE date = ...
à chacun de ces tableaux. Lorsque vous voulez interroger les données à partir de plusieurs jours, vous pouvez utiliser UNION_ALL.and you can schedule the reading from kinesis and loading to Redshift every hour
- tous les liens sur la façon de le faire, s'il vous plaît?S3 -> Redshift
? Je n'ai pas vu les docs sur l'utilisation de Lambda pour copier des données à partir de S3 de Redshift.aws-kinesis-connectors
's Redshift exemple, il suffit de lancer l'ANT (après modification de code pour mon projet) localement? Si le programme s'arrête en cours d'exécution, c'est à dire que j'ai frappéCTRL + z
, le Flux encore sortie de Redshift?aws-kinesis-connectors
, (2) créer une AWS Lambda fonction qui, à unPutRecord
de Kinesis, exécute unINSERT
en Redshift ou (3) ???. À partir de votre aide réponses, je crois que #2 est pauvre car il nécessite trop de connexions ouvertes à Redshift - plusCOPY
>INSERT
par votre réponse à cette question. #1 semble être une bonne façon d'aller, mais il n'est pas clair pour moi comment utiliser le projet pour la manipulation de JSON enregistrements de Kinesis -> Redshift.Une option à envisager est de donner du temps de la série tableaux en DynamoDB où vous créez un tableau tous les jours de la semaine, ou dans DynamoDB à écrire chaque interaction de l'utilisateur. À la fin de la période de temps (jour, heure ou à la semaine), vous pouvez copier les journaux sur Redshift.
Pour plus de détails, sur DynamoDB temps de la série de table voir ce modèle: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.TimeSeriesDataAccessPatterns
et ce blog:
http://aws.typepad.com/aws/2012/09/optimizing-provisioned-throughput-in-amazon-dynamodb.html
Pour Redshift DynamoDB copie: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/RedshiftforDynamoDB.html
Espère que cette aide.
Si il y a déjà accepté de répondre ici, AWS a lancé un nouveau service appelé Kinesis "Firehose" qui s'occupe de l'agrégation selon des intervalles définis par l'utilisateur, une temporaire à télécharger pour le s3 et le télécharger (ENREGISTRER) pour redshift, de tentatives et d'erreurs de manipulation, le débit de gestion,etc...
C'est probablement la méthode la plus simple et la plus fiable pour le faire.
Vous pouvez écrire des données dans un fichier CSV sur la disque local, puis exécutez Python/boto/psycopg2 script pour charger des données Amazon Redshift.
Dans mon CSV_Loader_For_Redshift je fais juste que:
Compresser et de charger des données à S3 en utilisant boto module Python et de téléchargement en plusieurs parties.
Utilisation psycopg2 commande de COPIE d'ajouter des données à Redshift table.
Juste d'être un peu égoïste ici et décrivant exactement ce Chasse-neige ,un événement plate-forme d'analyse ne. Ils utilisent ce génial façon unique de collecte des journaux d'événements à partir du client et de les regrouper sur S3.
Ils utilisent Cloudfront pour cela. Ce que vous pouvez faire est, l'hôte d'un pixel dans l'un des S3 et le mettre seau derrière une distribution CloudFront comme une origine. Activer les logs d'un compartiment S3 pour le même CloudFront.
Vous pouvez envoyer des journaux comme paramètres d'url à chaque fois que vous l'appelez pixel sur votre client (similaire à google analytics). Ces journaux peuvent ensuite être enrichi et ajouté à Redshift de la base de données à l'aide de la Copie.
Cela résout le but de l'agrégation de journaux. Cette installation se chargera de tout pour vous.
Vous pouvez aussi regarder Piwik qui est un open source service d'analyse et de voir si vous pouvez la modifier en fonction de vos besoins.