我使用带有DataNodes的AWS Data Pipeline导出DynamoDB表> S3BackupLocation>压缩设置为GZIP
。我期望压缩输出具有.gz
扩展名,但我得到了未压缩的输出而没有扩展名。
Further reading显示压缩字段“仅支持与Amazon Redshift一起使用,并且当您将S3DataNode与CopyActivity一起使用时。”
如何将DynamoDB表的gzipped备份到S3中?我是否必须下载所有文件,gzipping并上传它们?有没有办法让管道与CopyActivity一起工作?有更好的方法吗?
我一直在尝试使用Hive进行导出,但我还没有找到一种方法来在输出上获得格式。它需要与下面的格式匹配,以便EMR作业可以将其与来自其他来源的数据一起读取。
{"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"}}
答案 0 :(得分:2)
我也一直在寻找如何做到这一点。这是一个基本的要求,我很惊讶它不是基础数据管道工作流程的一部分。
经过数天的调查和实验,我发现了两种机制:
1)使用ShellCommandActivity启动一些aws cli命令(s3 cp,gzip)从s3下载,在本地gzip,然后重新上传到s3。以下是相关部分:
{
"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)创建一个单独的EMR集群,然后创建一个使用该EMR集群运行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\"]"
}
在他们两个之间,我喜欢第二个,因为s3distcp可以自动删除源s3文件。但是,它需要运行单独的EMR群集(成本较高)。或者您可以在#1中添加其他步骤以进行删除。
此外,如果您想参数化,您可能需要直接内联值,以便您可以利用#{format(@ scheduledStartTime,'YYYY-MM-dd_hh.mm')}等内容。