本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
優化 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 EMR 會根據目前佈建的輸送量來管理 DynamoDB 資料表的請求負載。然而,當 Amazon EMR 傳回的作業資訊含有大量超出佈建輸送量限制的回應時,您可以在設定 Hive 資料表期間利用 dynamodb.throughput.read.percent
參數調整預設讀取率。如需設定讀取百分比參數的詳細資訊,請參閱 Hive 選項。
寫入百分比設定
依預設,Amazon EMR 會根據目前佈建的輸送量來管理 DynamoDB 資料表的請求負載。不過,當 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 執行個體的數量;若是從 CLI 啟動叢集,則以選項 ‑‑num-instances
進行。
在執行個體上執行的映射任務數量視 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
呼叫。為了確保此種狀況不會發生,應定期監控讀取量,並到 Amazon CloudWatch 檢查記錄和監控指標,藉以調節應用程式至 DynamoDB::Get
的呼叫。
請求時間
當對 DynamoDB 資料表的需求較低時,排程存取 DynamoDB 資料表的 Hive 查詢可改善效能。舉例而言,若大多數的應用程式使用者住在舊金山,您可以選擇在太平洋標準時間 (PST) 上午 4 點匯出每日資料。當時大部分的使用者仍在睡眠中,因此無需更新 DynamoDB 資料庫中的記錄。
時間型資料表
如果資料是整理為一系列時間型的 DynamoDB 資料表,例如一天一份資料表,則您可以在資料表不再處於作用中狀態時,將資料匯出。您可使用這種技巧,以持續進行中的方式將資料備份至 Amazon S3。
封存的資料
如果您打算對儲存在 DynamoDB 中的資料執行多次 Hive 查詢,則在應用程式可接受封存資料的情況下,您可能需要將資料匯出至 HDFS 或 Amazon S3,並對資料複本執行 Hive 查詢,而非 DynamoDB。如此可保留您的讀取操作和佈建的輸送量。