Tablestore SDK for Go を使用して検索インデックスデータをスプリットし、スプリットを並列にスキャンすることで、大規模なエクスポートを効率化できます。
前提条件
開始する前に、次の準備を完了してください。
Tablestore Go SDK をインストールし、クライアントを初期化します。
並列スキャンには Tablestore SDK for Go 1.6.0 以降が必要です。最新バージョンの使用を推奨します。
説明
並列エクスポートでは、最初に ComputeSplits を呼び出してスキャンセッションを作成し、推奨される同時実行数を取得します。次に、同時実行される各ワーカーが、一意の CurrentParallelID を指定して ParallelScan を呼び出し、NextToken を使用して自身のスプリットを継続的に読み取ります。並列スキャンは結果セット全体の順序を保証しないため、結果の順序に依存しない大規模なエクスポートに適しています。単一ワーカーでスキャンする場合は、MaxParallel を 1、CurrentParallelID を 0 に設定することもできます。この場合、コードはよりシンプルになり、スループットは通常、検索よりも高い一方で、複数ワーカーによるスキャンよりは低くなります。
並列スキャンはソートまたは集約をサポートしていません。結果のソート、集約の実行、または検索結果をエンドユーザーに返す必要がある場合は、検索を使用してください。
同じ SessionId を使用するワーカーは、最初の ParallelScan 呼び出し時にデータスナップショットを確立します。タスク実行中に挿入または更新されたデータは、このスナップショットには含まれません。SessionId は省略できますが、サーバー側の負荷分散などの変更により、少数の重複行が発生する可能性があります。ComputeSplits を先に呼び出し、返された SessionId を後続リクエストに含めることを推奨します。
同一の検索インデックス上で同時に実行できる並列スキャンタスクは最大 10 件です。その他の制限については、検索インデックスの制限をご参照ください。
次の例では、ComputeSplits から返される推奨同時実行数に基づいて複数のゴルーチンを開始し、各ワーカーに一意の CurrentParallelID を割り当て、すべてのスプリットを読み取ります。
splits, err := client.ComputeSplits(
(&tablestore.ComputeSplitsRequest{}).
SetTableName("example_table").
SetSearchIndexSplitsOptions(tablestore.SearchIndexSplitsOptions{
IndexName: "example_index",
}),
)
if err != nil {
log.Fatal(err)
}
var waitGroup sync.WaitGroup
var mutex sync.Mutex
totalRows := 0
errors := make(chan error, splits.SplitsSize)
waitGroup.Add(int(splits.SplitsSize))
for workerID := int32(0); workerID < splits.SplitsSize; workerID++ {
currentWorkerID := workerID
go func() {
defer waitGroup.Done()
scanQuery := search.NewScanQuery().
SetQuery(&search.MatchAllQuery{}).
SetLimit(1000).
SetMaxParallel(splits.SplitsSize).
SetCurrentParallelID(currentWorkerID)
request := (&tablestore.ParallelScanRequest{}).
SetTableName("example_table").
SetIndexName("example_index").
SetScanQuery(scanQuery).
SetSessionId(splits.SessionId).
SetColumnsToGet(&tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
})
for {
response, err := client.ParallelScan(request)
if err != nil {
errors <- err
return
}
// ここで response.Rows を処理します。
mutex.Lock()
totalRows += len(response.Rows)
mutex.Unlock()
if len(response.NextToken) == 0 {
return
}
request.SetScanQuery(scanQuery.SetToken(response.NextToken))
}
}()
}
waitGroup.Wait()
close(errors)
for err := range errors {
log.Fatal(err)
}
fmt.Println(totalRows)
パラメータ
スキャンセッションの作成
|
名前 |
タイプ |
説明 |
|
TableName (必須) |
string |
データテーブルの名前。 |
|
IndexName (必須) |
string |
検索インデックスの名前。 |
並列スキャンリクエスト
|
名前 |
タイプ |
説明 |
|
TableName (必須) |
string |
データテーブルの名前。 |
|
IndexName (必須) |
string |
検索インデックスの名前。 |
|
ScanQuery (必須) |
search.ScanQuery |
スキャン条件と同時実行数の設定。 |
|
SessionId (任意) |
[]byte |
ComputeSplits から返されるセッション ID。同一のデータスナップショットをスキャン全体で維持するために、このパラメータを指定することを推奨します。 |
|
ColumnsToGet (任意) |
*tablestore.ColumnsToGet |
返却カラムの設定。省略した場合、プライマリキーのカラムのみが返されます。ParallelScan は ReturnAll をサポートしていません。 |
|
TimeoutMs (任意) |
*int32 |
リクエストのタイムアウト時間 (ミリ秒)。 |
スキャン設定
|
名前 |
タイプ |
説明 |
|
Query (必須) |
search.Query |
スキャン条件。検索でサポートされているベクタークエリ以外のクエリタイプをサポートします。 |
|
Limit (任意) |
int32 |
1 リクエストあたりに返される行数の上限。デフォルト値は 2,000 です。最大 10,000 まで設定可能ですが、値を大きくするとリクエストのレイテンシとリソース使用量が増加します。 |
|
MaxParallel (任意) |
int32 |
ワーカーの総数。デフォルト値:1。この値は、ComputeSplits から返される SplitsSize を超えることはできません。 |
|
CurrentParallelID (任意) |
int32 |
現在のワーカー ID。MaxParallel が 1 より大きい場合、このパラメータは必須です。ワーカー ID は一意である必要があり、 [0, MaxParallel) の範囲内で指定してください。 |
|
Token (任意) |
[]byte |
前回のレスポンスで返された NextToken の値。 |
|
AliveTime (任意) |
int32 |
2 回のページネーションリクエスト間の最大間隔 (秒)。有効な値:1~600。デフォルト値:60。デフォルト値のまま使用することを推奨します。データリクエストが成功するたびに、有効期間が更新されます。 |
返却カラムの設定
|
名前 |
タイプ |
説明 |
|
Columns (任意) |
[]string |
返却する検索インデックスのフィールド。データテーブルにのみ存在し、検索インデックスに含まれていないフィールドは返却できません。 |
|
ReturnAllFromIndex (任意) |
bool |
検索インデックスからすべてのフィールドを返すかどうかを指定します。デフォルト値:false。このパラメータが true の場合、Columns を指定する必要はありません。 |
|
ReturnAll (任意) |
bool |
並列スキャンはこのパラメータをサポートしていません。true に設定しないでください。 |
インデックスの切り替えを伴うスキーマ変更、サーバーフェイルオーバー、または負荷分散により、セッションが早期に無効になって OTSSessionExpired が返される場合があります。クライアントのネットワークエラーによってスキャンが中断される場合もあります。このようなエラーが発生した場合は、不完全な結果を破棄し、ComputeSplits を再度呼び出して、スキャンタスク全体を最初から再開してください。
レスポンス
スプリット情報
|
名前 |
タイプ |
説明 |
|
SessionId |
[]byte |
同一のデータスナップショットをスキャンするために使用されるタスクセッション ID。 |
|
SplitsSize |
int32 |
検索インデックスでサポートされる最大の同時実行数。 |
スキャン結果
|
名前 |
タイプ |
説明 |
|
Rows |
[]*tablestore.Row |
現在のスキャンで返された行。 |
|
NextToken |
[]byte |
次のページのトークン。値が空でない場合は、現在のスプリットのスキャンを継続してください。 |