HDInsight 和 Azure Data Lake Storage Gen1 上的 MapReduce 效能微調方針

必要條件

參數

在執行 MapReduce 作業時,您可以設定以下最重要的參數,以在 Data Lake Storage Gen1 上增加效能︰

參數 描述
Mapreduce.map.memory.mb 要配置給各對應器的記憶體數量。
Mapreduce.job.maps 每個作業的對應工作數目。
Mapreduce.reduce.memory.mb 要配置給各歸納器的記憶體數量。
Mapreduce.job.reduces 每個作業的減少工作數目。

Mapreduce.map.memory/Mapreduce.reduce.memory

根據對應和/或減少工作所需的記憶體調整此數量。 您可以透過 Yarn 設定,在 Ambari 中檢視 mapreduce.map.memorymapreduce.reduce.memory 的預設值。 在 Ambari 中瀏覽至 YARN,然後檢視 [設定] 索引標籤。YARN 記憶體隨即顯示。

Mapreduce.job.maps/Mapreduce.job.reduces

這會決定要建立的對應器或歸納器數目上限。 分割數會決定要為 MapReduce 作業建立多少對應器。 因此,如果分割數比要求的對應器數目少,您所得到的對應器可能會比您要求的少。

指引

步驟 1:決定執行的作業數目

根據預設,MapReduce 會為您的作業使用整個叢集。 您可以使用比可用容器還少的對應器,來使用較少的叢集。 本文中的指導方針假設您的應用程式是叢集上唯一執行的應用程式。

步驟 2:設定 mapreduce.map.memory/mapreduce.reduce.memory

對應和縮減工作的記憶體大小會取決於您的特定作業。 如果您想要增加並行能力,您可以減少記憶體大小。 並行執行工作的數目取決於容器數目。 藉由降低每個對應器或歸納器的記憶體數量,即可建立更多容器,而讓更多的對應器或歸納器並行執行。 減少太多的記憶體數量可能會導致某些處理程序耗盡記憶體。 如果您在執行作業時遇到堆積錯誤,您應該增加各對應器或歸納器的記憶體。 應該考慮新增更多容器會對每個額外的容器新增額外的負擔,因此可能會降低效能。 另一個方式是使用擁有較高數量記憶體的叢集,或增加叢集中的節點數目,以獲得更多的記憶體。 更多的記憶體就能使用更多的容器,亦即會有更多並行能力。

步驟 3︰確定 YARN 記憶體總數

若要調整 mapreduce.job.maps/mapreduce.job.reduces,請考慮可供使用的 YARN 記憶體總數。 這項資訊可在 Ambari 中取得。 瀏覽至 YARN,然後檢視 [設定] 索引標籤。YARN 記憶體會顯示在此視窗中。 請將 YARN 記憶體乘上叢集中的節點數目,以算出 YARN 記憶體總數。

Total YARN memory = nodes * YARN memory per node

如果您使用空白叢集,則記憶體會是叢集的 YARN 記憶體總數。 如果有其他應用程式使用記憶體,則您可以選擇僅使用部分的叢集記憶體,方法是將對應器或歸納器的數量減少為您想要使用的容器數量。

步驟 4:計算 YARN 容器的數量

YARN 容器會決定作業可用的並行數量。 取得 YARN 記憶體總數,然後除以 mapreduce.map.memory。

# of YARN containers = total YARN memory / mapreduce.map.memory

步驟 5:設定 mapreduce.job.maps/mapreduce.job.reduces

將 mapreduce.job.maps/mapreduce.job.reduces 設定為至少是可用容器的數目。 您可以進一步試驗,將對應器和歸納器的數目增加,看看是否能獲得更好的效能。 請記住,更多的對應器會產生額外的負擔,因此對應器過多可能會降低效能。

CPU 排程和 CPU 隔離預設會關閉,因此 YARN 容器的數目會受記憶體所限制。

計算範例

設想您目前有由 8 個 D14 節點所組成的叢集,而且您想要執行 I/O 密集作業。 以下是您應該進行的計算︰

步驟 1:決定執行的作業數目

在我們的範例中,我們假設我們的作業是唯一在執行的作業。

步驟 2:設定 mapreduce.map.memory/mapreduce.reduce.memory

在我們的範例中,您正在執行需要 I/O 密集的作業,並決定對應工作的記憶體 3 GB 已足夠。

mapreduce.map.memory = 3GB

步驟 3︰確定 YARN 記憶體總數

total memory from the cluster is 8 nodes * 96GB of YARN memory for a D14 = 768GB

步驟 4︰計算 YARN 容器的數目

# of YARN containers = 768 GB of available memory / 3 GB of memory = 256

步驟 5:設定 mapreduce.job.maps/mapreduce.job.reduces

mapreduce.map.jobs = 256

限制

Data Lake Storage Gen1 節流

Data Lake Storage Gen1 為多租用戶服務,因此會設定帳戶層級的頻寬限制。 如果您達到這些限制,您將會開始看到工作失敗。 透過觀察工作記錄中的節流錯誤即可加以識別。 如果您的作業需要更多頻寬,請與我們連絡。

若要檢查您是否遭到節流,您必須在用戶端啟用偵錯記錄。 做法如下:

  1. 將下列屬性放在 [Ambari] > [YARN] > [設定] > [進階 yarn-log4j] 的 log4j 屬性中:log4j.logger.com.microsoft.azure.datalake.store=DEBUG

  2. 重新啟動所有節點/服務,以便讓設定生效。

  3. 如果您遭到節流,您會看到 YARN 記錄檔中有 HTTP 429 錯誤碼。 YARN 記錄檔位於 /tmp/<user>/yarn.log 中

要執行的範例

為示範 MapReduce 在 Data Lake Storage Gen1 中的執行方式,以下提供一些使用下列設定在叢集上執行的範例程式碼︰

  • 16 節點 D14v2
  • 執行 HDI 3.6 的 Hadoop 叢集

以下是一些用來執行 MapReduce Teragen、Terasort 和 Teravalidate 的範例命令,您可以從這邊來著手。 您可以根據您的資源調整這些命令。

Teragen

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar teragen -Dmapreduce.job.maps=2048 -Dmapreduce.map.memory.mb=3072 10000000000 adl://example/data/1TB-sort-input

Terasort

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar terasort -Dmapreduce.job.maps=2048 -Dmapreduce.map.memory.mb=3072 -Dmapreduce.job.reduces=512 -Dmapreduce.reduce.memory.mb=3072 adl://example/data/1TB-sort-input adl://example/data/1TB-sort-output

Teravalidate

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar teravalidate -Dmapreduce.job.maps=512 -Dmapreduce.map.memory.mb=3072 adl://example/data/1TB-sort-output adl://example/data/1TB-sort-validate