1

我使用AWS Data Pipeline导出DynamoDB表,其中DataNodes> S3BackupLocation> Compression设置为GZIP。我预计压缩输出的扩展名为.gz,但我得到了未压缩的输出,没有扩展名。DynamoDB导出为gzip JSON

Further reading显示压缩字段“仅支持与Amazon Redshift一起使用,并且当您使用S3DataNode和CopyActivity时”。

如何获取我的DynamoDB表的gzipped备份到S3?我必须诉诸下载所有文件,gzip他们,并上传他们?有没有办法使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"}} 

回答

2

我也一直在寻找如何做到这一点。这是一个基本要求,我很惊讶它不是基础数据管道工作流的一部分。

经过调查和实验的日子里,我发现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')}之类的东西。