2016-09-07 45 views
2

SegmentTotalSegmentsパラメータを使用して、DynamoDBのスキャンを複数のワーカーに分割しています(デベロッパーガイドのParallel Scan section参照)。DynamoDB並列スキャンで結果が分割されない

ただし、すべての結果が1人のワーカーに返されます。ここで何が問題になるのでしょうか?スレッドの実装方法に問題はありますか?

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') 

出力:私にジャンプ

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 

答えて

0

ことの一つは、フィルタ式です。

フィルタ式に一致する項目がすべて最初のセグメントに配置されている可能性があります。

パラレルスキャンではアイテムが分割されませんが、アイテムの検索対象となるキースペースは分割されます。非常に大きなハイウェイを複数のレーンに分割すると考えてください。ほとんどの車が高速車線にあり、他の車線には車が見えない可能性があります。

フィルタの表現は、1つのセグメントだけがアイテムを返す原因になっているようです。

0

DynamoDBセッションとクライアントを作成し、すべてのスレッドで共有します。あなたがその例を見ても、それはしません。セッションとクライアントを作成して、各スレッドが独自のものを持つようにしてください。この問題はなくなるでしょう。

関連する問題