我也一直在尋找如何做到這一點。這是一個基本要求,我很驚訝它不是基礎數據管道工作流的一部分。
經過調查和實驗的日子裏,我發現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')}之類的東西。