我也一直在寻找如何做到这一点。这是一个基本要求,我很惊讶它不是基础数据管道工作流的一部分。
经过调查和实验的日子里,我发现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')}之类的东西。