

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

# 優化 DynamoDB 中的 Amazon EMR 操作效能
<a name="EMR_Hive_Optimizing"></a>

 DynamoDB 資料表上的 Amazon EMR 操作算作讀取操作，會受到資料表佈建輸送量設定的限制。Amazon EMR 會採用自己的邏輯來試圖平衡 DynamoDB 資料表上的負載，盡可能降低超出佈建輸送量的可能性。在每一次 Hive 查詢的最後，Amazon EMR 都會用於處理查詢的叢集資訊，包含超出佈建輸送量的次數。您能夠運用此資訊並參考與 DynamoDB 輸送量相關的 CloudWatch 指標，藉此在後續請求中妥善管理 DynamoDB 資料表上的負載。

 下列因素會在搭配 DynamoDB 資料表使用時，影響 Hive 查詢的效能。

## 佈建的讀取容量單位
<a name="ProvisionedReadCapacityUnits"></a>

 在針對 DynamoDB 資料表執行 Hive 查詢時，需要確保已先佈建好充足的讀取容量單位。

 例如，假設您已為 DynamoDB 資料表佈建 100 單位的讀取容量。這會讓您每秒執行 100 次讀取或是 409,600 位元組。若資料表含有 20 GB 的資料 (21,474,836,480 位元組)，而您的 Hive 查詢要執行一次完整的資料表掃描，就可以估算查詢所需的執行時間：

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

 減少所需時間的唯一方法，便是調整來源 DynamoDB 資料表的讀取容量單位。將更多節點新增至 Amazon EMR 叢集並沒有效果。

 在 Hive 輸出中，當一或多個映射器程序結束後，即會更新完成的百分比。若為大型 DynamoDB 資料表，而採用低佈建讀取容量設定，則輸出完成的百分比可能在相當長一段時間內不會更新；在上述情況下，任務會有好幾個小時皆顯示為 0% 完成。如需作業進度詳細的狀態資訊，請移至 Amazon EMR 主控台，即可檢視個別映射器的作業狀態，以及資料讀取的統計數據。

 您也可在主節點上登入 Hadoop 界面並查看 Hadoop 的統計數據。此會顯示您個別映射任務的狀態，以及一些資料讀取的統計數據。如需詳細資訊，請參閱《Amazon EMR 管理指南》**中的[主節點上託管的 Web 介面](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-web-interfaces.html)。

## 讀取百分比設定
<a name="ReadPercent"></a>

 依預設，Amazon EMR 會根據目前佈建的輸送量來管理 DynamoDB 資料表的請求負載。然而，當 Amazon EMR 傳回的作業資訊含有大量超出佈建輸送量限制的回應時，您可以在設定 Hive 資料表期間利用 `dynamodb.throughput.read.percent` 參數調整預設讀取率。如需設定讀取百分比參數的詳細資訊，請參閱 [Hive 選項](EMR_Interactive_Hive.md#EMR_Hive_Options)。

## 寫入百分比設定
<a name="WritePercent"></a>

 依預設，Amazon EMR 會根據目前佈建的輸送量來管理 DynamoDB 資料表的請求負載。不過，當 Amazon EMR 傳回的作業資訊含有大量超出佈建輸送量限制的回應時，您可以在設定 Hive 資料表期間利用 `dynamodb.throughput.write.percent` 參數調整預設寫入率。如需有關設定寫入百分比參數的詳細資訊，請參閱 [Hive 選項](EMR_Interactive_Hive.md#EMR_Hive_Options)。

## 重試期間設定
<a name="emr-ddb-retry-duration"></a>

 依預設，如果 Amazon EMR 在預設的兩分鐘重試間隔內未傳回結果，即會重新執行 Hive 查詢。您可以在執行 Hive 查詢時，藉由修改 `dynamodb.retry.duration` 參數，調整此間隔。如需有關設定寫入百分比參數的詳細資訊，請參閱 [Hive 選項](EMR_Interactive_Hive.md#EMR_Hive_Options)。

## 映射任務數量
<a name="NumberMapTasks"></a>

 Hadoop 為了處理您匯出和查詢儲存在 DynamoDB 內資料的請求所啟動的映射器精靈，其上限為每秒 1 MiB 的最大讀取速率，以限制使用的讀取容量。如果在 DynamoDB 上有其他可用的佈建輸送量，您可以提高映射器精靈的數量，藉此改善 Hive 匯出和查詢操作的效能。若要如此，您可以增加叢集中 EC2 執行個體的數量，*或*增加在各個 EC2 執行個體上執行的映射器常駐程式的數量。

 您可以停止目前叢集，再以更多的 EC2 執行個體數目重新啟動，即可增加叢集中 EC2 執行個體的數量。如果您是於 Amazon EMR 主控台啟動叢集，則於**設定 EC2 執行個體**對話方塊指定 EC2 執行個體的數量；若是從 CLI 啟動叢集，則以選項 `--num-instances` 進行。

 在執行個體上執行的映射任務數量視 EC2 執行個體類型的差異而定。如需支援的 EC2 執行個體類型和各類型提供的映射器數量的詳細資訊，請參閱 [任務組態](emr-hadoop-task-config.md)。可在此找到各支援設定的「任務設定」一節。

 另一種增加映射器精靈數目的方式，便是將 Hadoop 的 `mapreduce.tasktracker.map.tasks.maximum` 組態參數變更為更大的值。這種作法的優點在於，可提供更多映射器，但不會增加 EC2 執行個體的數量或大小，更為省錢。缺點則是，若您將數值設得太高，叢集中的 EC2 執行個體讀記憶體可能不足。若要設定 `mapreduce.tasktracker.map.tasks.maximum`，請啟動叢集，並指定將 `mapreduce.tasktracker.map.tasks.maximum` 的值指定為 mapred-site 組態分類的屬性。如以下範例所示。如需詳細資訊，請參閱[設定應用程式](emr-configure-apps.md)。

```
{
    "configurations": [
    {
        "classification": "mapred-site",
        "properties": {
            "mapred.tasktracker.map.tasks.maximum": "10"
        }
    }
    ]
}
```

## 平行資料請求
<a name="ParallelDataRequests"></a>

 針對單一資料表的多個資料請求，無論是來自一名以上的使用者還是一個以上的應用程式，都會耗盡讀取佈建輸送量，降低效能。

## 處理持續時間
<a name="ProcessDuration"></a>

 DynamoDB 中的資料一致性取決於每個節點讀取和寫入操作的順序。當 Hive 查詢正在進行中時，另一個應用程式可以將新資料載入 DynamoDB 資料表，或修改或刪除現有的資料。在此案例中，Hive 查詢的結果有可能無法反映執行查詢的過程中所做的資料變更。

## 避免超出輸送量
<a name="AvoidExceedingThroughput"></a>

 對 DynamoDB 執行 Hive 查詢時，請注意不要超過您佈建的輸送量，否則會耗盡所需容量，導致應用程式無法進行 `DynamoDB::Get` 呼叫。為了確保此種狀況不會發生，應定期監控讀取量，並到 Amazon CloudWatch 檢查記錄和監控指標，藉以調節應用程式至 `DynamoDB::Get` 的呼叫。

## 請求時間
<a name="RequestTime"></a>

 當對 DynamoDB 資料表的需求較低時，排程存取 DynamoDB 資料表的 Hive 查詢可改善效能。舉例而言，若大多數的應用程式使用者住在舊金山，您可以選擇在太平洋標準時間 (PST) 上午 4 點匯出每日資料。當時大部分的使用者仍在睡眠中，因此無需更新 DynamoDB 資料庫中的記錄。

## 時間型資料表
<a name="TimeBasedTables"></a>

 如果資料是整理為一系列時間型的 DynamoDB 資料表，例如一天一份資料表，則您可以在資料表不再處於作用中狀態時，將資料匯出。您可使用這種技巧，以持續進行中的方式將資料備份至 Amazon S3。

## 封存的資料
<a name="ArchivedData"></a>

 如果您打算對儲存在 DynamoDB 中的資料執行多次 Hive 查詢，則在應用程式可接受封存資料的情況下，您可能需要將資料匯出至 HDFS 或 Amazon S3，並對資料複本執行 Hive 查詢，而非 DynamoDB。如此可保留您的讀取操作和佈建的輸送量。