1

J'ai exporté une table DynamoDB à l'aide d'un pipeline de données AWS avec DataNodes> S3BackupLocation> Compression définie sur GZIP. Je m'attendais à une sortie compressée avec une extension .gz, mais j'ai obtenu une sortie non compressée sans extension.Exportation DynamoDB en tant que gzippé JSON

Further reading indique que le champ de compression "est uniquement pris en charge pour une utilisation avec Amazon Redshift et lorsque vous utilisez S3DataNode avec CopyActivity".

Comment puis-je obtenir une sauvegarde gzippée de ma table DynamoDB dans S3? Dois-je recourir au téléchargement de tous les fichiers, à leur téléchargement et à leur téléchargement? Y a-t-il un moyen de faire fonctionner le pipeline avec CopyActivity? Est-ce qu'il y a une meilleure approche?

J'ai expérimenté avec l'utilisation de Hive pour l'exportation, mais je n'ai pas encore trouvé un moyen d'obtenir le bon formatage sur la sortie. Il doit correspondre au format ci-dessous afin que les travaux EMR puissent le lire avec les données d'une autre source.

{"col1":{"n":"596487.0550532"},"col2":{"s":"xxxx-xxxx-xxxx"},"col3":{"s":"xxxx-xxxx-xxxx"}} 
{"col1":{"n":"234573.7390354"},"col2":{"s":"xxxx-xxxx-xxxx"},"col3":{"s":"xxxx-xxxxx-xx"}} 
{"col2":{"s":"xxxx-xxxx-xxxx"},"col1":{"n":"6765424.7390354"},"col3":{"s":"xxxx-xxxxx-xx"}} 

Répondre

2

J'ai aussi cherché comment faire ceci. C'est une requête tellement fondamentale que je suis surpris qu'elle ne fasse pas partie d'un flux de travail de pipeline de données de base.

Après des jours d'investigation et d'expérimentation, j'ai trouvé 2 mécanismes:

1) utilisent ShellCommandActivity pour lancer quelques aws commandes cli (s3 cp, gzip) pour télécharger à partir s3, gzip localement, puis re -upload à s3. Voici les parties pertinentes:

{ 
    "name": "CliActivity", 
    "id": "CliActivity", 
    "runsOn": { 
     "ref": "Ec2Instance" 
    }, 
    "type": "ShellCommandActivity", 
    "command": "(sudo yum -y update aws-cli) && (#{myCopyS3ToLocal}) && (#{myGzip}) && (#{myCopyLocalToS3})" 
}, 

"values": { 
    "myCopyS3ToLocal": "aws s3 cp s3://your-bucket/your-folders/ --recursive", 
    "myGzip": "for file in /tmp/random-date/*; do gzip \"$file\"; done", 
    "myCopyLocalToS3": "aws s3 cp /tmp/random-date s3://your-bucket/your-folders-gz/ --recursive" 
} 

2) créer un cluster distinct DME, puis créer un pipeline de données qui utilise ce cluster DME pour exécuter S3DistCp (s3-dist-cp).

{ 
    "name": "CliActivity", 
    "id": "CliActivity", 
    "runsOn": { 
     "ref": "Ec2Instance" 
    }, 
    "type": "ShellCommandActivity", 
    "command": "(sudo yum -y update aws-cli) && (#{myAWSCLICmd})" 
}, 

"values": { 
    "myAWSCLICmd": "aws emr add-steps --cluster-id j-XXXXYYYYZZZZ --region us-east-1 --steps Name=\"S3DistCp command runner\",Jar=\"command-runner.jar\",Args=[\"s3-dist-cp\",\"--s3Endpoint=s3.amazonaws.com\",\"--src=s3://your-bucket/your-folders/\",\"--dest=s3://your-bucket/your-folders-gz/\",\"--outputCodec=gz\"]" 
} 

Entre les deux d'entre eux, j'aime la seconde parce s3distcp peut supprimer automatiquement les fichiers de la source. Cependant, il nécessite un cluster EMR distinct pour fonctionner (coût plus élevé). Ou vous pouvez ajouter une étape supplémentaire à # 1 pour effectuer la suppression. De plus, si vous voulez paramétrer, vous devrez peut-être directement aligner les valeurs pour pouvoir profiter de choses comme # {format (@ scheduledStartTime, 'YYYY-MM-dd_hh.mm')}.