最佳化 DynamoDB 中 Amazon EMR操作的效能 - Amazon EMR

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

最佳化 DynamoDB 中 Amazon EMR操作的效能

DynamoDB 資料表上的 Amazon EMR操作會計算為讀取操作,並受資料表佈建的輸送量設定所約束。Amazon 會EMR實作自己的邏輯,以嘗試平衡 DynamoDB 資料表上的負載,將超過佈建輸送量的可能性降至最低。在每個 Hive 查詢結束時,Amazon 會EMR傳回用於處理查詢之叢集的相關資訊,包括超過佈建輸送量的次數。您可以使用此資訊以及 DynamoDB 輸送量的 CloudWatch 指標,在後續請求中更好地管理 DynamoDB 資料表上的負載。

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

佈建的讀取容量單位

在針對 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 介面

讀取百分比設定

根據預設,Amazon 會根據您目前的佈建輸送量,管理 DynamoDB 資料表EMR的請求負載。不過,當 Amazon EMR傳回包含大量佈建輸送量超過回應的任務相關資訊時,您可以在設定 Hive 資料表時使用 dynamodb.throughput.read.percent 參數調整預設讀取速率。如需設定讀取百分比參數的詳細資訊,請參閱 Hive 選項

寫入百分比設定

根據預設,Amazon 會根據您目前的佈建輸送量,管理 DynamoDB 資料表EMR的請求負載。不過,當 Amazon EMR傳回包含大量佈建輸送量超過回應的任務相關資訊時,您可以在設定 Hive 資料表時使用 dynamodb.throughput.write.percent 參數調整預設寫入速率。如需有關設定寫入百分比參數的詳細資訊,請參閱 Hive 選項

重試期間設定

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

映射任務數量

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

您可以停止目前的叢集並使用更多EC2執行個體重新啟動叢集,以增加叢集中的EC2執行個體數量。如果您從 Amazon EMR主控台啟動叢集,請在EC2設定EC2執行個體對話方塊中指定執行個體數量,如果您從 啟動叢集,則使用 ‑‑num-instances選項指定 CLI。

在執行個體上執行的映射任務數量取決於EC2執行個體類型。如需有關支援的EC2執行個體類型和每個執行個體提供的映射器數量的詳細資訊,請參閱 任務組態。可在此找到各支援設定的「任務設定」一節。

另一種增加映射器精靈數目的方式,便是將 Hadoop 的 mapreduce.tasktracker.map.tasks.maximum 組態參數變更為更大的值。這有助於為您提供更多映射器,而不會增加EC2執行個體的數量或大小,從而節省您的成本。缺點是將此值設定為過高可能會導致叢集中的EC2執行個體耗盡記憶體。若要設定 mapreduce.tasktracker.map.tasks.maximum,請啟動叢集,並指定將 mapreduce.tasktracker.map.tasks.maximum 的值指定為 mapred-site 組態分類的屬性。如以下範例所示。如需詳細資訊,請參閱設定應用程式

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

平行資料請求

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

處理持續時間

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

避免超出輸送量

對 DynamoDB 執行 Hive 查詢時,請注意不要超過您佈建的輸送量,否則會耗盡所需容量,導致應用程式無法進行 DynamoDB::Get 呼叫。為了確保不會發生這種情況,您應該定期監控應用程式呼叫的讀取磁碟區和限流,DynamoDB::Get方法是檢查日誌並監控 Amazon 中的指標 CloudWatch。

請求時間

當對 DynamoDB 資料表的需求較低時,排程存取 DynamoDB 資料表的 Hive 查詢可改善效能。舉例而言,若大多數的應用程式使用者住在舊金山,您可以選擇在太平洋標準時間 (PST) 上午 4 點匯出每日資料。PST,當大多數使用者都處於休眠狀態,而且沒有更新 DynamoDB 資料庫中的記錄時。

時間型資料表

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

封存的資料

如果您計劃針對儲存在 DynamoDB 中的資料執行許多 Hive 查詢,而您的應用程式可以容忍封存的資料,您可能想要將資料匯出至 HDFS或 Amazon S3,並根據資料複本執行 Hive 查詢,而不是 DynamoDB 如此可保留您的讀取操作和佈建的輸送量。