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')}之類的東西。