2012-04-05 59 views
1

我想從mysql數據庫傳輸數據(21M行)到DynamoDB。我使用boto Python API和django 1.3.1從mysql中導出數據並將其傳輸到DynamoDB。下面是代碼:從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行。任何想法加快這一進程?

我會創建更多的線程和parellize轉移,看看是否有幫助。

謝謝。

回答

2

首先,您的DynamoDB表的預配吞吐量是多少?這將最終控制你可以做多少寫/秒。相應地調整。

其次,獲得某種併發。你可以使用線程(確保每個線程都有它自己的連接對象,因爲httplib.py不是線程安全的),或者你可以使用gevent或多進程或你喜歡的任何機制,但併發是關鍵。

+0

謝謝,我把預置寫吞吐量提高到400,但它沒有幫助。我會使用併發性並再次運行傳輸。 – 2012-04-05 14:41:01

+0

我嘗試使用併發性,但它沒有太大的幫助。我正在使用運行django1.3的m1.large EC2實例。我正在考慮將數據從mysql導出到S3,然後使用EMR將數據從S3導出到DynamoDB。思考? – 2012-04-06 00:00:43

+0

好的,如果您的表的配置爲每秒400次寫入,並且您有2100萬行,理論上可以在大約14.5小時內完成。但是,假定每個記錄最多爲1K字節。這就是400的意思;大小爲1K或更小的400個寫入。你的物品有多大? – garnaat 2012-04-06 01:03:47