

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 個位元組)，而且您想要使用 `SELECT` 陳述式來選擇使用 HiveQL 的所有資料。您可以估計查詢執行需要多長時間，如下所示：

 「21,474,836,480 / 409,600 = 52,429 秒 = 14.56 小時」** 

在此案例中，DynamoDB 資料夾是瓶頸。這將無助於新增更多 Amazon EMR 節點，因為 Hive 輸送量限制為每秒只有 409,600 個位元組。減少 `SELECT` 陳述式所需時間的唯一方法，是增加 DynamoDB 資料表佈建的讀取容量。

您可以執行類似的計算，估計將大量載入資料帶入映射至 DynamoDB 資料表之 Hive 外部資料表所需的時間。決定每個項目所需的寫入容量單位總數 (小於 1KB = 1、1-2KB = 2，以此類推)，並將其乘以要載入的項目數。這將為您提供所需的寫入容量單位數目。將該數目除以每秒配置的寫入容量單位數目。這將產生載入資料表所需的秒數。

您應該定期監控資料表的 CloudWatch 指標。如需在 DynamoDB 主控台取得快速概觀，請選擇您的資料表，然後選擇 **Metrics** (指標) 索引標籤。您可以從此處檢視已耗用的讀取和寫入容量單位，以及已限流的讀取和寫入請求。

## 讀取容量
<a name="EMRforDynamoDB.PerformanceTuning.Throughput.ReadCapacity"></a>

Amazon EMR 會根據資料表佈建輸送量設定，管理您的 DynamoDB 資料表的請求負載。不過，如果在任務輸出中發現大量的 `ProvisionedThroughputExceeded` 訊息，您可以調整預設讀取率。若要執行此操作，您可以修改 `dynamodb.throughput.read.percent` 組態變數。您可以使用 `SET` 命令在 Hive 命令提示字元中設定此變數：

```
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` 組態變數。您可以使用 `SET` 命令在 Hive 命令提示字元中設定此變數：

```
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 時，請確認寫入容量單位數大於叢集中的映射器數量。例如，考慮使用由 10 個 *m1.xlarge* 節點的 Amazon EMR 叢集。此 *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)。