

# マッパーの調整
<a name="EMRforDynamoDB.PerformanceTuning.Mappers"></a>

Hive が Hadoop ジョブを起動すると、このジョブは 1 つ以上のマッパータスクによって処理されます。DynamoDB テーブルに十分なスループットキャパシティが用意されているのであれば、クラスター内のマッパーの数が変更可能なので、これによりパフォーマンスを向上させられる可能性があります。

**注記**  
Hadoop ジョブで使用されるマッパータスクの数は、Hadoop がデータを論理ブロックに分割する入力分割による影響を受けます。Hadoop により十分な入力分割が行われない場合、書き込みオペレーションが、DynamoDB テーブルで使用可能なすべての書き込みスループットを消費できないことがあります。

## マッパーの数を増やします
<a name="EMRforDynamoDB.PerformanceTuning.Mappers.Increasing"></a>

Amazon EMR の各マッパーの最大読み込みレートは、1 秒あたり 1 MiB です。クラスター内のマッパーの数は、そのクラスター内のノードのサイズによって異なります。(ノードのサイズとノードあたりのマッパー数については、「Amazon EMR デベロッパーガイド」の「[タスクの設定](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hadoop-task-config.html)」を参照してください。)

DynamoDB テーブルに十分な読み込み用スループット容量がある場合は、次のいずれかの方法でマッパーの数を増やすことができます。
+ クラスター内のノードのサイズを大きくする。例えば、クラスターで (ノードごとに 3 つのマッパー) *m1.large* ノードを使用しているのであれば、これを (ノードごとに 8 つのマッパー) *m1.xlarge* ノードにアップグレードしてみることができます。
+ クラスター内のノード数を増やす。たとえば、3 つの m1.xlarge ノードを持つクラスターであれば、合計 24 個のマッパーを使用できます。同じタイプのノードでクラスターのサイズを 2 倍にすれば、48 個のマッパーが使用可能になります。

AWS マネジメントコンソール マネジメントコンソールを使用して、クラスター内のノードのサイズまたは数を管理することができます。(これらの変更を有効にするには、クラスターの再起動が必要な場合があります。)

マッパーの数を増やすもう 1 つの方法は、`mapred.tasktracker.map.tasks.maximum` Hadoop の設定パラメータを変更することです。(これは Hadoop パラメータであり、Hive パラメータではないため、コマンドプロンプトからインタラクティブに変更することはできません。) `mapred.tasktracker.map.tasks.maximum` の値を増加することで、ノードのサイズや数を増やすことなく、マッパーの数を増やすことができます。ただし、この値を高く設定しすぎると、クラスターノードのメモリが不足する可能性があります。

`mapred.tasktracker.map.tasks.maximum` の値は、Amazon EMR クラスターを初めて起動する際のブートストラップアクションの中で設定します。詳細については、「Amazon EMR 管理ガイド」の「[(オプション) 追加のソフトウェアをインストールするためのブートストラップアクションの作成](https://docs.aws.amazon.com/ElasticMapReduce/latest/ManagementGuide/emr-plan-bootstrap.html)」を参照してください。

## マッパーの数を減らします
<a name="EMRforDynamoDB.PerformanceTuning.Mappers.Decreasing"></a>

`SELECT` ステートメントを使用して DynamoDB にマッピングする外部 Hive テーブルからデータを選択する場合、Hadoop ジョブはクラスター内のマッパーの最大数まで、必要な数のタスクを使用できます。このシナリオでは、長時間実行される Hive クエリが DynamoDB テーブルのプロビジョニングされた読み込みキャパシティーをすべて消費することで、他のユーザーに悪影響を与える可能性があります。

`dynamodb.max.map.tasks` パラメータを使用して、マップタスクの上限を設定することができます。

```
SET dynamodb.max.map.tasks=1
```

この値は、1 以上にする必要があります。Hive がクエリを処理する際に実行される Hadoop ジョブは、DynamoDB テーブルからの読み込み時、`dynamodb.max.map.tasks` を超えるタスクを使用することはありません。