Azure HDInsight 互動式查詢叢集 (Hive LLAP) 大小調整指南

本文件說明一般工作負載的 HDInsight 互動式查詢叢集 (Hive LLAP 叢集) 大小,以達到合理的效能。 請注意,本檔中提供的建議是一般指導方針,而特定工作負載可能需要特定的微調。

HDInsight 互動式查詢叢集的 Azure 預設 VM 類型(LLAP)

節點類型 執行個體 大小
Head D13 v2 8 vcpus、56 GB RAM、400 GB SSD
工作人員 D14 v2 16 vcpus、112 GB RAM、800 GB SSD
ZooKeeper A4 v2 4 vcpus、8 GB RAM、40 GB SSD

注意:所有建議的組態值都是以 D14 v2 類型背景工作節點為基礎

設定

設定機碼 建議值 描述
yarn.nodemanager.resource.memory-mb 102400 (MB) 節點上所有 YARN 容器的指定記憶體總計,以 MB 為單位
yarn.scheduler.maximum-allocation-mb 102400 (MB) RM 中每個容器要求的最大配置,以 MB 為單位。 高於此值的記憶體要求不會生效
yarn.scheduler.maximum-allocation-vcores 12 Resource Manager 上每個容器要求的 CPU 核心數目上限。 高於此值的要求不會生效。
yarn.nodemanager.resource.cpu-vcores 12 每個可配置給容器的 NodeManager CPU 核心數目。
yarn.scheduler.capacity.root.llap.capacity 85 (%) LLAP 佇列的 YARN 容量配置
tez.am.resource.memory.mb 4096 (MB) tez AppMaster 要使用的記憶體數量以 MB 為單位
hive.server2.tez.sessions.per.default.queue <number_of_worker_nodes> hive.server2.tez.default.queues 中每個佇列的會話數目。 此數字對應至查詢協調器數目(Tez AM)
hive.tez.container.size 4096 (MB) 以 MB 為單位的指定 Tez 容器大小
hive.llap.daemon.num.executors 19 每個 LLAP 精靈的執行程式數目
hive.llap.io.threadpool.size 19 執行程式線程集區大小
hive.llap.daemon.yarn.container.mb 81920 (MB) 個別 LLAP 精靈所使用的 MB 記憶體總計 (每個精靈的記憶體數)
hive.llap.io.memory.size 242688 (MB) 已啟用每個 LLAP 精靈快取 MB 的快取大小
hive.auto.convert.join.noconditionaltask.size 2048 (MB) 以 MB 為單位進行對應聯結的記憶體大小

LLAP 架構/元件:

`LLAP Architecture/Components`.

LLAP 精靈大小估計:

1.判斷節點上所有容器的 YARN 記憶體配置總計

設定: yarn.nodemanager.resource.memory-mb

此值表示每個節點上 YARN 容器可以使用的最大記憶體總和 MB。 指定的值應該小於該節點上物理記憶體的總數量。
節點上所有 YARN 容器的總記憶體 = (物理記憶體總計 – OS 的記憶體 + 其他服務)
將此值設定為 ~90% 的可用 RAM 大小。
針對 D14 v2,建議值為 102400 MB。 

2.判斷每個 YARN 容器要求的最大記憶體數量

組態: yarn.scheduler.maximum-allocation-mb

該值指示 Resource Manager 上每個容器要求的最大資源分派 (以 MB 為單位)。 高於指定值的記憶體要求將不會生效。 Resource Manager 可以遞增 yarn.scheduler.minimum-allocation-mb 為容器提供記憶體,而且不能超過 yarn.scheduler.maximum-allocation-mb指定的大小。 指定的值不應超過 yarn.nodemanager.resource.memory-mb指定節點上所有容器的指定記憶體總數。
針對 D14 v2 背景工作節點,建議值為 102400 MB

3.判斷每個 YARN 容器要求的最大數量vcores

設定: yarn.scheduler.maximum-allocation-vcores

該值指示 Resource Manager 上每個容器要求的虛擬 CPU 核心的最大數目。 要求較高的數目 vcores ,這個值將不會生效。 它是 YARN 排程器的全域屬性。 針對 LLAP 精靈容器,此值可設定為可用 vcores總數的 75%。 其餘 25% 應保留給在 NodeManager、DataNode 和在背景工作節點上執行的其他服務。
16 vcores D14 v2 VM 上有 75% 的 VM 16 vcores 可供 LLAP 精靈容器使用。
針對 D14 v2,建議值為 12

4.並行查詢數目

設定: hive.server2.tez.sessions.per.default.queue

此組態值會確定可以平行啟動的 Tez 工作階段數目。 這些 Tez 工作階段會針對 「hive.server2.tez.default.queues」 所指定的每個佇列啟動。它對應於 Tez AM 數目(查詢協調器)。 建議與背景工作節點數目相同。 Tez AM 的數目可以高於 LLAP 精靈節點的數目。 Tez AM 的主要責任是協調查詢執行,並將查詢計劃片段指派給對應的 LLAP 精靈來執行。 將此值保留為多個 LLAP 精靈節點的倍數,以達到更高的輸送量。

默認 HDInsight 叢集有四個 LLAP 精靈在四個背景工作節點上執行,因此建議值為 4

Hive 組態變數的 Ambari UI 滑桿 hive.server2.tez.sessions.per.default.queue

`LLAP maximum concurrent queries`.

5. Tez 容器和 Tez 應用程式主要大小

設定: tez.am.resource.memory.mb、hive.tez.container.size

tez.am.resource.memory.mb - 定義 Tez 應用程式主要大小。
建議值為 4096 MB

hive.tez.container.size - 定義針對 Tez 容器指定的記憶體數量。 此值必須在 YARN 容器大小下限(yarn.scheduler.minimum-allocation-mb) 和 YARN 最大容器大小(yarn.scheduler.maximum-allocation-mb) 之間設定。 LLAP 精靈執行程式會使用該值來限制每個執行程式的記憶體使用量。
建議值為 4096 MB

6. LLAP 佇列容量配置

設定: yarn.scheduler.capacity.root.llap.capacity

該值指示提供給 LLAP 佇列的容量百分比。 根據 YARN 佇列的設定方式,容量資源分派對於不同的工作負載可能會有不同的值。 如果您的工作負載是只讀作業,將其設定為 90% 的容量應該可行。 不過,如果您的工作負載混合受控資料表的更新/刪除/合併作業,建議您為 LLAP 佇列提供 85% 的容量。 壓縮等其他作業可以使用剩餘的 15% 容量,以從預設佇列配置容器。 透過這種方式,預設佇列中的工作就不會佔用 YARN 資源。

對於 D14v2 背景工作節點,LLAP 佇列 的建議值為 85
(對於只讀工作負載,可以視需要增加至90個。

7. LLAP 精靈容器大小

設定: hive.llap.daemon.yarn.container.mb

LLAP 精靈會在每個背景工作節點上以 YARN 容器的形式執行。 LLAP 精靈容器的記憶體大小總計取決於下列因素:

  • YARN 容器大小的設定 (yarn.scheduler.minimum-allocation-mb, yarn.scheduler.maximum-allocation-mb, yarn.nodemanager.resource.memory-mb)
  • 節點上的 Tez AM 數目
  • 針對節點和 LLAP 佇列容量上所有容器所設定的記憶體總計

Tez 應用程式主機(Tez AM) 所需的記憶體可以計算如下。
Tez AM 會作為查詢協調器,而且應該根據要服務的多個並行查詢來設定 Tez AM 數目。 理論上,我們可以針對每個背景工作節點考慮一個TezAM。 不過,您可能會在背景工作節點上看到多個 Tez AM。 為了計算目的,我們假設所有 LLAP 精靈節點/背景工作節點之間的 Tez AM 分佈統一。 建議每個 Tez AM 有 4 GB 的記憶體。

Tez Ams = Hive config hive.server2.tez.sessions.per.default.queue 所指定的值。
Ambari UI 中 env 變數 num_llap_nodes_for_llap_daemons 指定的 LLAP 精靈節點數目 = 。
Tez AM 容器大小 = Tez config tez.am.resource.memory.mb 所指定的值。

每個節點的 Tez AM 記憶體 = ceilTez AMs / 數目 LLAP 精靈節點數目x Tez AM 容器大小****
針對 D14 v2,預設設定有四個 Tez AM 和四個 LLAP 精靈節點。
每個節點的 Tez AM 記憶體 = (ceil(4/4) x 4 GB) = 4 GB

每個背景工作節點可計算 LLAP 佇列可用的記憶體總數,如下所示:
此值取決於節點上所有 YARN 容器可用的記憶體總量(yarn.nodemanager.resource.memory-mb)和針對 LLAP 佇列設定的容量百分比(yarn.scheduler.capacity.root.llap.capacity)。
背景工作節點上 LLAP 佇列的總記憶體 = 節點上所有 YARN 容器可用的記憶體總計 x LLAP 佇列容量的百分比。
若為 D14 v2,此值為 (100 GB x 0.85) = 85 GB。

LLAP 精靈容器大小計算如下:

LLAP 精靈容器大小 = (背景工作節點上 LLAP 佇列的記憶體總計) - (每個節點的 Tez AM 記憶體) - (服務主要容器大小)
叢集上只有一個服務主機(LLAP 服務的應用程式主機)在其中一個背景工作節點上繁衍。 為了計算目的,我們會針對每個背景工作節點考慮一個服務主機。
針對 D14 v2 背景工作節點,HDI 4.0 - 建議值為 (85 GB - 4 GB - 1 GB)) = 80 GB

8. 判斷每個 LLAP 精靈的執行程式數目

設定: hive.llap.daemon.num.executorshive.llap.io.threadpool.size

hive.llap.daemon.num.executors
此組態控制每個 LLAP 精靈可平行執行工作的執行程式數目。 該值取決於虛擬核心的數目、每個執行程式使用的記憶體數量,以及 LLAP 精靈容器可用的總記憶體數量。 每個背景工作節點可過度訂閱 120% 的可用虛擬核心數目。 不過,如果它不符合每個執行程式和 LLAP 精靈容器大小所需的記憶體需求,則應該加以調整。

每個執行程式相當於一個 Tez 容器,可以取用 4 GB (Tez 容器大小) 的記憶體。 LLAP 精靈中的所有執行程式會共用相同的堆積記憶體。 假設並非所有執行程式同時執行記憶體密集作業,您可以考慮每個執行程式使用 75% 的 Tez 容器大小 (4 GB)。 透過這種方式,您可以藉由為每個執行程式提供較少的記憶體 (例如 3 GB) 來增加執行程式的數目,以增加平行性。 不過,建議您針對目標工作負載調整此設定。

D14 v2 VM 上有 16 個虛擬核心。 針對 D14 v2,針對執行程式數目的建議值為 (16 個虛擬核心 x 120%) ~= 19 ,每個背景工作節點上考慮每個執行程式 3 GB。

hive.llap.io.threadpool.size
這個值會指定執行程式線程集區大小。 由於執行程式已依指定修正,因此與每個 LLAP 精靈的執行程式數目相同。
針對 D14 v2,建議值為 19

9.判斷 LLAP 精靈快取大小

設定: hive.llap.io.memory.size

LLAP 精靈容器記憶體包含下列元件:

  • 頭室
  • 執行程式所使用的堆積記憶體 (Xmx)
  • 每個精靈的記憶體內部快取 (其卸除堆積記憶體大小,在啟用 SSD 快取時不適用)
  • 記憶體內部快取元資料大小(僅適用於啟用 SSD 快取時)

前端大小:此大小表示用於 Java VM 額外負荷的堆積記憶體部分(中繼空間、線程堆棧、 gc 數據結構等)。 一般而言,此額外負荷大約是堆積大小的 6% (Xmx)。 為了更安全,此值可計算為 LLAP 精靈記憶體大小總計的 6%。
針對 D14 v2,建議值為 ceil(80 GB x 0.06) ~= 4 GB

堆積大小(Xmx):這是所有執行程式可用的堆積記憶體數量。 堆積大小總計 = 執行程式的數目 x 3 GB
若為 D14 v2,此值為 19 x 3 GB = 57 GB

Ambari environment variable for LLAP heap size:

`LLAP heap size`.

停用 SSD 快取時,記憶體內部快取是從 LLAP 精靈容器大小取出空餘空間大小和堆積大小之後留下的記憶體數量。

啟用 SSD 快取時,快取大小計算會有所不同。 設定 hive.llap.io.allocator.mmap = true 可啟用 SSD 快取。 啟用 SSD 快取時,會使用部分記憶體來儲存 SSD 快取的中繼資料。 中繼資料會儲存在記憶體中,且預期為 ~8% 的 SSD 快取大小。
SSD 快取記憶體內部中繼資料大小 = LLAP 精靈容器大小 - (空餘空間 + 堆積大小)
針對 D14 v2,使用 HDI 4.0,SSD 快取記憶體內部元數據大小 = 80 GB - (4 GB + 57 GB) = 19 GB

給定儲存 SSD 快取中繼資料的可用記憶體大小,我們可以計算可支援的 SSD 快取大小。
SSD 快取的記憶體內部元資料大小 = LLAP 精靈容器大小 - (前端空間 + 堆積大小) = 19 GB
SSD 快取的大小 = SSD 快取的記憶體內部元數據大小(19 GB) / 0.08 (8%)

針對 D14 v2 和 HDI 4.0,建議的 SSD 快取大小 = 19 GB / 0.08 ~= 237 GB

10.調整對應聯結記憶體

設定: hive.auto.convert.join.noconditionaltask.size

請確定您 已啟用hive.auto.convert.join.noconditionaltask ,此參數才會生效。 此組態會決定Hive優化器所選取 MapJoin 選取的臨界值,該優化器會考慮從其他執行程式過度訂閱記憶體,以有更多空間供記憶體內部哈希表使用,以允許更多對應聯結轉換。 考慮到每個執行程式 3 GB,此大小可以過度訂閱 3 GB,但某些堆積記憶體也可用於排序緩衝區、隨機緩衝區等作業。
因此,針對每個執行程式具有 3 GB 記憶體的 D14 v2,建議將此值設定為 2048 MB

(注意:此值可能需要適合您工作負載的調整。設定此值太低可能不會使用自動轉換功能。設定太高可能會導致記憶體例外狀況不足,或 GC 暫停可能會導致不良效能。

11.LLAP 精靈的數目

Ambari 環境變數: num_llap_nodes、num_llap_nodes_for_llap_daemons

num_llap_nodes - 指定 Hive LLAP 服務所使用的節點數目,這包括執行 LLAP 精靈、LLAP Service Master 和 Tez Application Master(Tez AM) 的節點。

`Number of Nodes for LLAP service`.
num_llap_nodes_for_llap_daemons - 只用於 LLAP 精靈的指定節點數目。 LLAP 精靈容器大小會設定為最大符合節點的大小,因此會在每個節點上產生一個 llap 精靈。

`Number of Nodes for LLAP daemons`.

建議讓這兩個值與互動式查詢叢集中的背景工作節點數目相同。

工作負載管理的考慮

如果您想要啟用 LLAP 的工作負載管理,請確定您保留足夠的容量,讓工作負載管理如預期般運作。 工作負載管理需要設定自定義 YARN 佇列,除了 llap 佇列之外。 請務必根據您的工作負載需求,在佇列和工作負載管理佇列之間 llap 分割叢集資源容量總計。 啟動資源計劃時,工作負載管理會繁衍 Tez 應用程式主機(Tez AM)。

注意

  • 藉由啟動資源計劃,從工作負載管理佇列取用資源所產生Tez AM,如所 hive.server2.tez.interactive.queue指定。
  • Tez AM 的數目取決於資源計劃中指定的值 QUERY_PARALLELISM
  • 一旦工作負載管理作用中,將不會使用 LLAP 佇列中的 Tez VM。 只有來自工作負載管理佇列的 Tez AM 會用於查詢協調。 停用工作負載管理時,會使用佇列中的 llap Tez VM。

例如:叢集容量總計 = 100 GB 記憶體,在 LLAP、工作負載管理和預設佇列之間除以如下:

  • LLAP 佇列容量 = 70 GB
  • 工作負載管理佇列容量 = 20 GB
  • 預設佇列容量 = 10 GB

使用 20 GB 的工作負載管理佇列容量,資源計劃可以將值指定 QUERY_PARALLELISM 為五個,這表示工作負載管理可以啟動 4 GB 容器大小的五個 Tez AM。 如果 QUERY_PARALLELISM 高於容量,您可能會看到某些 Tez AM 停止響應 ACCEPTED 狀態。 Hive 伺服器 2 Interactive 無法將查詢片段提交至未處於 RUNNING 狀態的 Tez VM。

後續步驟

如果設定這些值無法解決問題,請瀏覽下列其中一項...