【问题标题】:DynamoDB export as gzipped JSONDynamoDB 导出为 gzip 格式的 JSON
【发布时间】:2017-10-03 01:38:37
【问题描述】:

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

Further reading 显示压缩字段“仅支持用于 Amazon Redshift 以及当您将 S3DataNode 与 CopyActivity 一起使用时。”

如何将我的 DynamoDB 表的 gzip 备份到 S3?我必须求助于下载所有文件,压缩它们并上传它们吗?有没有办法让管道与 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"}}

【问题讨论】:

    标签: amazon-web-services amazon-s3 hive amazon-dynamodb amazon-data-pipeline


    【解决方案1】:

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

    经过几天的调查和实验,我发现了两种机制:

    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')} 之类的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2016-10-20
      相关资源
      最近更新 更多