メニュー
Amazon DynamoDB
開発者ガイド (API Version 2012-08-10)

DynamoDB プロビジョンドスループット

外部 DynamoDB テーブルに対して HiveQL ステートメントを発行すると、DynamoDBStorageHandler クラスは適切な低レベル DynamoDB API リクエストを行い、プロビジョンドスループットを消費します。DynamoDB テーブルに十分な読み取りまたは書き込み容量がない場合、リクエストは調整され、HiveQL のパフォーマンスが遅くなります。そのため、テーブルに十分な容量があることを確認する必要があります。

例えば、DynamoDB テーブルに対して 100 ユニットの読み取りキャパシティーをプロビジョニングしているとします。この場合、1 秒間に 409,600 バイトの読み取り (100 × 4 KB 読み取り容量ユニットサイズ) を実行できます。ここで、テーブルに 20 GB のデータ (21,474,836,480 バイト) が含まれており、HiveQL を使っているすべてのデータを SELECT ステートメントで選択するとします。クエリの実行時間を次のように推定できます。

21,474,836,480 / 409,600 = 52,429 秒 = 14.56 時間

このシナリオでは、DynamoDB テーブルがボトルネックとなります。Amazon EMR ノードを追加しても解決にはなりません。Hive スループットは毎秒 409,600バイトに制限されているからです。SELECT ステートメントに必要な時間を短縮する唯一の方法は、DynamoDB テーブルにプロビジョニングされた読み取り容量を増やすことです。

また同様の計算を実行して、DynamoDB テーブルにマップされた Hive 外部テーブルにデータを一括読み込みするのに必要な時間を推定することもできます。読み込むデータの合計バイト数を特定して、1 つの DynamoDB 書き込み容量ユニットのサイズ (1 KB) で割ります。これでテーブルを読み込む秒数が得られます。

テーブルの CloudWatch メトリクスを定期的にモニタリングする必要があります。DynamoDB コンソールの概要については、テーブルを選択し、[Metrics] タブを選択します。その後、消費された読み取りおよび書き込み容量ユニット、および調整された読み取りおよび書き込みリクエストを確認できます。

読み込みキャパシティー

Amazon EMR はテーブルのプロビジョニング済みスループットに基づいて、DynamoDB テーブルに対するリクエスト負荷を管理します。ただし、ジョブ出力に大量の ProvisionedThroughputExceeded メッセージがあることに気付いた場合、デフォルトの読み取りレートを調整することができます。これを行うには、dynamodb.throughput.read.percent 設定変数を変更します。SET コマンドを使って Hive コマンドプロンプトでこの変数を設定できます:

Copy
SET dynamodb.throughput.read.percent=1.0;

この変数は、現在の Hive セッションでのみ維持されます。Hive を終了して、あとで戻った場合、dynamodb.throughput.read.percent はデフォルト値に戻ります。

dynamodb.throughput.read.percent の値は 0.1 以上 1.5 以下にできます。0.5 はデフォルトの読み取りレートを示します。つまり、Hive はテーブルの読み取り容量の半分を消費しようと試みます。値が 0.5 を上回ると、Hive はリクエストレートを増やします。値が 0.5 を下回ると、読み取りリクエストレートを減らします。(実際の読み取りレートは、DynamoDB テーブルに統一キーディストリビューションがあるかどうかなどの要因によって変わります。)

Hive が頻繁にテーブルにプロビジョニングされた読み取り容量を使い切っていることに気付いた場合、または読み取りリクエストが過度に調整されている場合は、dynamodb.throughput.read.percent0.5 未満にしてみます。テーブルで十分な読み取り容量があり、HiveQL オペレーションの応答性を高める場合、0.5 を超える値に設定できます。

書き込みキャパシティー

Amazon EMR はテーブルのプロビジョニング済みスループットに基づいて、DynamoDB テーブルに対するリクエスト負荷を管理します。ただし、ジョブ出力に大量の ProvisionedThroughputExceeded メッセージがあることに気付いた場合、デフォルトの書き込みレートを調整することができます。これを行うには、dynamodb.throughput.write.percent 設定変数を変更します。SET コマンドを使って Hive コマンドプロンプトでこの変数を設定できます:

Copy
SET dynamodb.throughput.write.percent=1.0;

この変数は、現在の Hive セッションでのみ維持されます。Hive を終了して、あとで戻った場合、dynamodb.throughput.write.percent はデフォルト値に戻ります。

dynamodb.throughput.write.percent の値は 0.1 以上 1.5 以下にできます。0.5 はデフォルトの書き込みレートを示します。つまり、Hive はテーブルの書き込み容量の半分を消費しようと試みます。値が 0.5 を上回ると、Hive はリクエストレートを増やします。値が 0.5 を下回ると、書き込みリクエストレートを減らします。(実際の書き込みレートは、DynamoDB テーブルに統一キーディストリビューションがあるかどうかなどの要因によって変わります。)

Hive が頻繁にテーブルにプロビジョニングされた書き込み容量を使い切っていることに気付いた場合、または書き込みリクエストが過度に調整されている場合は、dynamodb.throughput.write.percent0.5 未満にしてみます。テーブルで十分な書き込み容量があり、HiveQL オペレーションの応答性を高める場合、0.5 を超える値に設定できます。

Hive を使用してデータを DynamoDB に書き込む場合は、書き込みキャパシティーユニットの数をクラスター内のマッパーの数より大きくする必要があります。たとえば、10 の m1.xlarge ノードで構成される Amazon EMR クラスターについて考えます。m1.xlarge ノードタイプは 8 つのマッパータスクが可能なので、クラスターには合計 80 のマッパー (10 × 8) があります。DynamoDB テーブルの書き込み容量ユニットが 80 未満の場合、Hive 書き込みオペレーションは、テーブルのすべての書き込みスループットを消費する可能性があります。

Amazon EMR ノードタイプのマッパーの数を決定するには、Amazon EMR 開発者ガイドタスクの設定を参照してください。

マッパーの詳細については、マッパーの調整を参照してください。