【问题标题】:Data transfer from mysql to DynamoDB从 mysql 到 DynamoDB 的数据传输
【发布时间】:2012-04-06 03:43:36
【问题描述】:

我想将数据(21M 行)从 mysql 数据库传输到 DynamoDB。我正在使用 boto Python API 和 django 1.3.1 从 mysql 导出数据并将其传输到 DynamoDB。下面是代码:

      conn = boto.connect_dynamodb()
      start_date = datetime.date(2012, 3, 1)
      end_date = datetime.date(2012, 3, 31)
      episode_report = TableName.objects.filter(viewdt__range=(start_date, end_date))
      #Paginate 21 million rows in chunks of 1000 each
      p = Paginator(episode_report, 1000)
      table = conn.get_table('ep_march')
      for page in range(1, p.num_pages + 1): 
          for items in p.page(page).object_list:
              item_data = {
                        'id': int(items.id),
                        'user_id': format_user(items.user),     #Foreign Key to User table
                        'episode_id': int(items.episode.id),          #Foreign Key to Episode table
                        'series_id': int(items.series.id),      #Foreign Key to Series Table
                        'viewdt': str(items.viewdt),                   
                     }
              item = table.new_item(
                                    # Our hash key is 'id'
                                    hash_key= int(items.id),
                                    # Our range key is 'viewdt'
                                    range_key= str(items.viewdt),
                                    # This has the
                                    attrs=item_data
                                )
              item.put() 

问题是该进程已经运行了超过 12 小时,并且仍然传输了 3M 行。有什么想法可以加快这个过程吗?

我会创建更多线程并将传输并行化,看看是否有帮助。

谢谢。

【问题讨论】:

    标签: django boto amazon-dynamodb


    【解决方案1】:

    首先,您的 DynamoDB 表的预置吞吐量是多少?这将最终控制您可以进行多少次写入/秒。相应调整。

    其次,进行某种并发。您可以使用线程(确保每个线程都有自己的连接对象,因为 httplib.py 不是线程安全的),或者您可以使用 gevent 或 multiprocess 或任何您喜欢的机制,但并发性是关键。

    【讨论】:

    • 谢谢,我将预置写入吞吐量提高到 400,但它没有帮助。我会使用并发并再次运行传输。
    • 我尝试使用并发,但它没有太大帮助。我正在使用一个运行 django1.3 的 m1.large EC2 实例。我正在考虑将数据从 mysql 导出到 S3,然后使用 EMR 将数据从 S3 导出到 DynamoDB。想法?
    • 好的,如果您将表配置为每秒 400 次写入并且您有 2100 万行,理论上可以在大约 14.5 小时内完成。但是,这假设每条记录最多为 1K 字节。这就是 400 的含义; 400 次写入大小为 1K 或更小。你的物品有多大?
    • 每条记录为 1048 字节。实际上写入吞吐量不是瓶颈,Consumed Write Cap 显示为 90.023。我能够在 3 小时内使用 CPU 利用率约为 120% 的多线程传输 1M 行。我可能会启动 22 个 EC2 实例并使用集群运行传输。
    【解决方案2】:

    Amazon 将批量数据传入和传出 DynamoDB 的解决方案是使用 Elastic MapReduce。以下是文档:http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多