

# DynamoDB のプロビジョニングされたスループット
<a name="EMRforDynamoDB.PerformanceTuning.Throughput"></a>

外部 DynamoDB テーブルに対して HiveQL ステートメントを発行すると、`DynamoDBStorageHandler` クラスにより、適切な低レベルの DynamoDB API リクエストが生成されます。このリクエストは、プロビジョニングされたスループットを消費します。十分な読み込みまたは書き込み容量が DynamoDB テーブルにない場合、リクエストはスロットリングされ、HiveQL のパフォーマンス低下を引き起こします。このためテーブルには、十分なスループットキャパシティーを確保する必要があります。

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

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

このシナリオでは、DynamoDB テーブルがボトルネックになります。Hive のスループットが 1 秒あたり 409,600 バイトに制限されているため、Amazon EMR ノードを追加することはできません。`SELECT` ステートメントの処理に必要な時間を短縮する唯一の方法は、DynamoDB テーブルのプロビジョニングされた読み込みキャパシティを増やすことです。

同様の計算により、DynamoDB テーブルにマッピングされた Hive 外部テーブルに、データを一括ロードする際に必要となる時間も推定できます。項目ごとに必要な書き込みキャパシティーユニットの合計数 (1KB = 1 未満、1～2KB = 2 など) を決定し、それにロードする項目数を掛けます。これにより、必要な書き込みキャパシティーユニットの数がわかります。その数を、1 秒あたりに割り当てられる書き込みキャパシティーユニットの数で割ります。これにより、テーブルのロードに要する秒数が計算できます。

テーブルの CloudWatch メトリクスは、定期的にモニタリングする必要があります。DynamoDB コンソールでその概要を簡単に確認するには、対象のテーブルを選択し、**[Metrics]** (メトリクス) タブを開きます。消費された読み込み/書き込みキャパシティーユニット数、および、スロットリングされた読み込み/書き込みリクエスト数を表示できます。

## 読み込みキャパシティ
<a name="EMRforDynamoDB.PerformanceTuning.Throughput.ReadCapacity"></a>

Amazon EMR は、テーブルでのプロビジョニング済みスループットの設定に応じて、DynamoDB テーブルに対するリクエスト負荷を管理します。しかし、ジョブ出力に多数の `ProvisionedThroughputExceeded` メッセージが見られる場合には、デフォルトの読み込みレートを調整することも可能です。このためには、`dynamodb.throughput.read.percent` 設定変数を変更できます。Hive コマンドプロンプトで `SET` コマンドを使用して、この変数を設定できます。

```
1. 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.percent` を `0.5` より低く設定してみてください。テーブルに十分な読み込みキャパシティがある場合で、HiveQL オペレーションにさらに高い応答性を求める場合には、この値を `0.5` より高く設定できます。

## 書き込みキャパシティ
<a name="EMRforDynamoDB.PerformanceTuning.Throughput.WriteCapacity"></a>

Amazon EMR は、テーブルでのプロビジョニング済みスループットの設定に応じて、DynamoDB テーブルに対するリクエスト負荷を管理します。しかし、ジョブ出力に多数の `ProvisionedThroughputExceeded` メッセージが見られる場合には、デフォルトの書き込みレートを調整することも可能です。このためには、`dynamodb.throughput.write.percent` 設定変数を変更できます。Hive コマンドプロンプトで `SET` コマンドを使用して、この変数を設定できます。

```
1. 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.percent` を `0.5` より低く設定してみてください。テーブルに十分なキャパシティがある場合で、HiveQL オペレーションにさらに高い応答性を求める場合には、この値を `0.5` より高く設定できます。

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

Amazon EMR での各ノードタイプのマッパーの数については、「Amazon EMR デベロッパーガイド」の「[タスクの設定](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hadoop-task-config.html)」を参照してください。

マッパーの詳細については、「[マッパーの調整](EMRforDynamoDB.PerformanceTuning.Mappers.md)」を参照してください。