Transférer les données vers Redshift
Amazon Redshift est un entrepôt de données populaire qui fonctionne sur Amazon Web Services aux côtés d’Amazon S3. Les données Braze provenant de Currents sont structurées de manière à pouvoir être transférées directement vers Redshift.
La procédure suivante décrit comment transférer des données depuis Amazon S3 vers Redshift via un processus ETL (extraire, transformer, charger). Pour obtenir le code source complet, veuillez consulter le référentiel GitHub des exemples Currents.
Notez que ce n’est qu’une des nombreuses options que vous pouvez choisir lorsqu’il s’agit de transférer vos données vers les emplacements les plus avantageux pour vous.
Aperçu du chargeur S3 vers Redshift
Les3loader.pyscript utilise une table manifeste distincte dans la même base de données Redshift pour garder une trace des fichiers qui ont déjà été copiés. La structure générale est la suivante :
- Veuillez répertorier tous les fichiers dans S3, puis identifier les nouveaux fichiers depuis la dernière exécution
s3loader.pyen comparant la liste avec le contenu du tableau manifeste. - Veuillez créer un fichier manifeste contenant les nouveaux fichiers.
- Exécutez une
COPYrequête pour copier les nouveaux fichiers de S3 vers Redshift à l’aide du fichier manifeste. - Veuillez insérer les noms des fichiers qui sont copiés dans le tableau de manifeste distinct dans Redshift.
- Engagez-vous.
Dépendances
Il est nécessaire d’installer le SDK Python AWS et Psycopg pour exécuter le chargeur :
1
2
pip install boto3
pip install psycopg2
Autorisations
Rôle Redshift avec accès en lecture S3
Si vous ne l’avez pas encore fait, veuillez suivre la documentation AWS pour créer un rôle capable d’exécuterCOPYdes commandes sur vos fichiers dans AWS S3.
Règles entrantes de Redshift VPC
Si votre cluster Redshift se trouve dans un VPC, il est nécessaire de configurer le VPC afin d’autoriser les connexions provenant du serveur sur lequel vous exécutez S3 Loader. Veuillez accéder à votre cluster Redshift et sélectionner l’entrée Groupes de sécurité VPC à laquelle vous souhaitez que le chargeur se connecte. Ensuite, veuillez ajouter une nouvelle règle entrante : Type = Redshift, Protocole = TCP, Port = le port de votre cluster, Source = l’adresse IP du serveur exécutant le chargeur (ou « Anywhere » pour les tests).
Utilisateur de gestion des identités et des accès (IAM) avec accès complet à S3
Le chargeur S3 nécessite un accès en lecture aux fichiers contenant vos données Currents, ainsi qu’un accès complet à l’emplacement/localisation des fichiers manifestes qu’il génère pour les commandes COPYRedshift. Veuillez créer un nouvel utilisateur IAM (Identity and Access Management) avec AmazonS3FullAccessl’autorisation de la console IAM. Veuillez enregistrer les informations d’identification, car vous devrez les transmettre au chargeur.
Vous pouvez transmettre les informations d’identification d’accès au chargeur via des variables d’environnement, le fichier d’informations d’identification partagé (~/.aws/credentials) ou le fichier de configuration AWS. Vous pouvez également les inclure directement dans le chargeur en les attribuant auxaws_secret_access_keychampsaws_access_key_idet d’unS3LoadJobobjet , mais nous déconseillons de coder en dur les informations d’identification dans votre code source.
Utilisation
Exemple d’utilisation
Le programme suivant charge les données relatives àusers.messages.contentcard.Impressionl’événement depuis S3 vers lacontent_card_impressiontable dans Redshift.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
if __name__ == '__main__':
host = '{YOUR_CLUSTER}.redshift.amazonaws.com'
port = 5439
database = '{YOUR_DATABASE}'
user = '{YOUR_USER}'
password = '{YOUR_PASSWORD}'
role = '{YOUR_REDSHIFT_ROLE_ARN}'
# Do not hard code these credentials.
aws_access_key_id = None
aws_secret_access_key = None
# Content Card Impression Avro fields:
# id - string
# user_id - string
# external_user_id - string (nullable)
# app_id - string
# content_card_id - string
# campaign_id - string (nullable)
# send_id - string (nullable)
# time - int
# platform - string (nullable)
# device_model - string (nullable)
print('Loading Content Card Impression...')
cc_impression_s3_bucket = '{YOUR_CURRENTS_BUCKET}'
cc_impression_s3_prefix = '{YOUR_CURRENTS_PREFIX}'
cc_impression_redshift_table = 'content_card_impression'
cc_impression_redshift_column_def = [
('id', 'text'),
('user_id', 'text'),
('external_user_id', 'text'),
('app_id', 'text'),
('content_card_id', 'text'),
('campaign_id', 'text'),
('send_id', 'text'),
('time', 'integer'),
('platform', 'text'),
('device_model', 'text')
]
cc_impression_redshift = RedshiftEndpoint(host, port, database, user, password,
cc_impression_redshift_table, cc_impression_redshift_column_def)
cc_impression_s3 = S3Endpoint(cc_impression_s3_bucket, cc_impression_s3_prefix)
cc_impression_job = S3LoadJob(cc_impression_redshift, cc_impression_s3, role,
aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)
cc_impression_job.perform()
Identifiants
Pour exécuter le chargeur, il est nécessaire de fournir les identifiants host,port , etdatabase de votre cluster Redshift, ainsi que les identifiantsuser etpassword d’un utilisateur Redshift autorisé à exécuterCOPYdes requêtes . De plus, vous devez fournir l’ARN du rôle Redshift avec accès en lecture S3 que vous avez créé dans une section précédente.
1
2
3
4
5
6
host = '{YOUR_CLUSTER}.redshift.amazonaws.com'
port = 5439
database = '{YOUR_DATABASE}'
user = '{YOUR_USER}'
password = '{YOUR_PASSWORD}'
role = '{YOUR_REDSHIFT_ROLE_ARN}'
Configuration de la tâche
Veuillez fournir le compartiment S3 et le préfixe de vos fichiers d’événements, ainsi que le nom de la table Redshift dans laquelle vous souhaitezCOPYles intégrer.
En outre, pour les fichiersCOPY Avro avec l’option « auto » requise par le chargeur, la définition des colonnes dans votre table Redshift doit correspondre aux noms de champs dans le schéma Avro, comme indiqué dans l’exemple de programme, avec le mappage de types approprié (par exemple,string à text,int à integer).
Vous pouvez également transmettre unebatch_sizeoption au chargeur si vous constatez que la copie de tous les fichiers en une seule fois prend trop de temps. Le passage d’un paramètrebatch_sizepermet au chargeur de copier et de valider progressivement un lot à la fois sans devoir tout copier simultanément. Le temps nécessaire au chargement d’un lot dépend de la configuration de votre clusterbatch_size Redshift, ainsi que de la taille de vos fichiers.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Content Card Impression Avro fields:
# id - string
# user_id - string
# external_user_id - string (nullable)
# app_id - string
# content_card_id - string
# campaign_id - string (nullable)
# send_id - string (nullable)
# time - int
# platform - string (nullable)
# device_model - string (nullable)
cc_impression_s3_bucket = '{YOUR_CURRENTS_BUCKET}'
cc_impression_s3_prefix = '{YOUR_CURRENTS_PREFIX}'
cc_impression_redshift_table = 'content_card_impression'
cc_impression_redshift_column_def = [
('id', 'text'),
('user_id', 'text'),
('external_user_id', 'text'),
('app_id', 'text'),
('content_card_id', 'text'),
('campaign_id', 'text'),
('send_id', 'text'),
('time', 'integer'),
('platform', 'text'),
('device_model', 'text')
]
cc_impression_batch_size = 1000
Modifier cette page sur GitHub