将数据从 MySQL 复制到 Amazon DynamoDB

Copying data from MySQL to Amazon DynamoDB

我在 MySQL 中有一个 table,包含 5 亿条记录。我想将此 table 导入亚马逊 DynamoDB.I 了解有两种方法:

  1. JAVA Api: 这种方法的问题是它很慢,而且有时会断开与数据库的连接。

  2. Amazon Data Import Pipeline:看起来很有希望,但是如何将数据从 MySQL 导出为 DynamoDB 识别的格式?

请告诉我两者之间最好的方法。

AWS 有两个服务可以帮助您执行该操作。

  • 数据管道
  • 带有 Hive 的 EMR 集群

数据管道

一个非常简单的方法 - 如果你的 "schemas" 相似(我总是觉得谈论 DynamoDB 的模式很尴尬) - 从 MySQL 导出到 S3,然后从 S3 导入到 DynamoDB。

Data Pipeline 有两个教程可以帮助您设置任务

http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-copydata-mysql.html http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-importexport-ddb-part1.html

您可以通过开发执行导入和导出的单个管道来进一步改进此过程。如果您需要在导入和导出之间转换数据,您将需要开发转换代码并从管道中执行它。

在数据管道术语中,这就是调用 Activity。 activity 可能像 shell 脚本一样简单,也可能像 EMR closer 上的 Hive / Hadoop / Pig 应用程序 运行 一样复杂。 http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-concepts-activities.html

Data Pipeline 还可以让您安排定期执行。

Hive 和 EMR

Hive 是一种 hadoop 工具,用于编写 SQL 命令来操作数据源。 Hive 在集群上 运行 的 Hadoop 应用程序中翻译 SQL。 您可以 运行 Hive on AWS Elastic Map Reduce Cluster(托管服务 hadoop 集群)。

EMR 上的 Hive 可以连接到非关系数据源,例如 S3 或 DynamoDB 数据库上的文件。它允许您在 DynamoDB 之上编写 SQL 语句!

在您的用例中,您需要编写一个 Hive 脚本来读取 MySQL 并写入 DynamoDB。您可以使用标准 (Hive) SQL 表达式转换数据。

有关 EMR 上的 Hive 的更多信息: http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-hive.html

更多关于 DynamoDB 和 Hive 的信息: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.Walkthrough.html http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/EMRforDynamoDB.html

除了其他答案,我想提一下 dynamodb 识别 csvtsv 格式的文件来导入。我们还可以使用 HIVE sql 使用 Elastic Map Reduce 从 csv 文件批量加载数据。我们唯一需要考虑的是 - 如果我们使用 windows 将 table 转储到 csv 那么我们必须确保 windows 系统的行结束 \r\n 替换为 \n 以使其与亚马逊兼容。

我发现对我来说最简单的方法是编写一个脚本,以此处指定的格式将所有信息传输到 json 文件中:AWS Load Data

{
    "ProductCatalog": [
        {
            "PutRequest": {
                "Item": {
                    "Id": {
                        "N": "101"
                    },
                    "Title": {
                        "S": "Book 101 Title"
                    },
                    "ISBN": {
                        "S": "111-1111111111"
                    },
                    "Authors": {
                        "L": [
                            {
                                "S": "Author1"
                            }
                        ]
                    },
                    "Price": {
                        "N": "2"
                    },
                    "Dimensions": {
                        "S": "8.5 x 11.0 x 0.5"
                    },
                    "PageCount": {
                        "N": "500"
                    },
                    "InPublication": {
                        "BOOL": true
                    },
                    "ProductCategory": {
                        "S": "Book"
                    }
                }
            }
        },
        {
            "PutRequest": {
                "Item": {
                    "Id": {
                        "N": "103"
                    },
                    "Title": {
                        "S": "Book 103 Title"
                    },
                    "ISBN": {
                        "S": "333-3333333333"
                    },
                    "Authors": {
                        "L": [
                            {
                                "S": "Author1"
                            },
                            {
                                "S": "Author2"
                            }
                        ]
                    },
                    "Price": {
                        "N": "2000"
                    },
                    "Dimensions": {
                        "S": "8.5 x 11.0 x 1.5"
                    },
                    "PageCount": {
                        "N": "600"
                    },
                    "InPublication": {
                        "BOOL": false
                    },
                    "ProductCategory": {
                        "S": "Book"
                    }
                }
            }
        },
        {
            "PutRequest": {
                "Item": {
                    "Id": {
                        "N": "205"
                    },
                    "Title": {
                        "S": "18-Bike-204"
                    },
                    "Description": {
                        "S": "205 Description"
                    },
                    "BicycleType": {
                        "S": "Hybrid"
                    },
                    "Brand": {
                        "S": "Brand-Company C"
                    },
                    "Price": {
                        "N": "500"
                    },
                    "Color": {
                        "L": [
                            {
                                "S": "Red"
                            },
                            {
                                "S": "Black"
                            }
                        ]
                    },
                    "ProductCategory": {
                        "S": "Bicycle"
                    }
                }
            }
        }
    ]
}

然后从我的控制台

创建表和 运行 代码
aws dynamodb batch-write-item --request-items file://ProductCatalog.json

下载并配置aws cli:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.CLI.html

如果您有像 PhpMyAdmin 这样的门户网站,您可以轻松地导出 您的数据到 JSON 格式。

接下来您手动创建 table。

最后,使用 Dynabase 您可以将 JSON 个文件导入 DynamoDB tables。尽管 Dynabase 是一个商业工具,但它确实解锁了所有必需的功能,即使使用试用许可证也是如此。

MySQL JSON 导出有时还存储有关 table 的附加信息。如有必要,我会手动编辑文件以仅保留文件的 data-portion。我导入的 JSON 文件的根目录中有一个数组,例如

[ 
  { "id": 1 , "foo" : "bar" }, 
  { "id": 361, "foo" : "baz" } 
]

您可能不需要转换数据格式。