2016-09-07 1 views
2

J'utilise les paramètres Segment et TotalSegments pour diviser mon scan DynamoDB sur plusieurs travailleurs (comme indiqué dans le Parallel Scan section du guide du développeur).DynamoDB Parallel Scan ne divise pas les résultats

Cependant, tous les résultats sont renvoyés à un seul opérateur. Quel pourrait être le problème ici? Est-ce qu'il y a peut-être un problème avec la façon dont j'ai implémenté le threading?

import threading 
import boto3 

def scan_foo_table(foo, segment, total_segments): 
    print 'Looking at segment ' + str(segment) 
    session = boto3.session.Session() 
    dynamoDbClient = session.client('dynamodb') 
    response = dynamoDbClient.scan(
     TableName='FooTable', 
     FilterExpression='bar=:bar', 
     ExpressionAttributeValues={ 
      ':bar': {'S': bar} 
     }, 
     Segment=segment, 
     TotalSegments=total_segments, 
    ) 
    print 'Segment ' + str(segment) + ' returned ' + str(len(response['Items'])) + ' items' 

def create_threads(bar): 
    thread_list = [] 
    total_threads = 3 

    for i in range(total_threads): 
     # Instantiate and store the thread 
     thread = threading.Thread(target=scan_foo_table, args=(bar, i, total_threads)) 
     thread_list.append(thread) 

    # Start threads 
    for thread in thread_list: 
     thread.start() 

    # Block main thread until all threads are finished 
    for thread in thread_list: 
     thread.join() 

def lambda_handler(event, context): 
    create_threads('123') 

Sortie:

Looking at segment 0 
Looking at segment 1 
Looking at segment 2 
Segment 1 returned 0 items 
Segment 2 returned 0 items 
Segment 0 returned 10000 items 

Répondre

0

Une chose qui saute aux yeux à moi est l'expression de filtre.

Il est possible que les éléments correspondant à votre expression de filtre se trouvent tous dans le premier segment.

Il convient également de noter qu'une analyse parallèle ne divise pas les éléments, mais divise l'espace clé dans lequel les éléments sont recherchés. Pensez-y comme divisant une très grande autoroute en plusieurs voies. Il est possible que la plupart des voitures sont dans la voie rapide et vous ne verrez pas de voitures dans les autres voies.

Bien que dans ce cas, il semble plus probable que l'expression de filtre est ce qui provoque un seul segment à retourner des éléments.

0

Vous créez la session DynamoDB ainsi que le client et le partage sur tous les threads. Si vous regardez l'exemple, ils ne le font pas. Essayez de créer la session et le client pour que chaque thread ait le sien, et ce problème disparaîtra probablement.