2012-04-05 4 views
1

mysql 데이터베이스에서 DynamoDB로 데이터 (21M 행)를 전송하고 싶습니다. 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가 threadsafe가 아니기 때문에 각 스레드가 자신의 연결 객체를 가지고 있는지 확인하십시오.) gevent 또는 multiprocess 또는 원하는 메커니즘을 사용할 수 있지만 동시성은 중요합니다.

+0

덕분에 프로비저닝 된 쓰기 처리량을 400으로 올렸지 만 도움이되지 않았습니다. 동시성을 사용하고 전송을 다시 실행합니다. –

+0

동시성을 사용해 보았지만 많은 도움이되지는 않습니다. django1.3을 실행중인 m1.large EC2 인스턴스를 사용하고 있습니다. mysql에서 S3으로 데이터를 내보내고 EMR을 사용하여 S3에서 DynamoDB로 데이터를 내보낼 생각입니다. 생각? –

+0

좋아요, 400 개의 쓰기/초에 대해 프로비저닝 된 테이블이 있고 2100 만 개의 행이 있다면 이론적으로 약 14.5 시간 내에 완료 할 수 있습니다. 그러나 각 레코드는 최대 1K 바이트라고 가정합니다. 그것이 400의 의미입니다. 크기가 1K 이하인 400 개의 쓰기 당신의 물건은 얼마나 큽니까? – garnaat