Azure HDInsight 互動式查詢叢集 (Hive LLAP) 調整大小指南
本文件描述如何針對一般工作負載調整 HDInsight 互動式查詢叢集 (Hive LLAP 叢集) 的大小,藉此提升效能。 請注意,本文件中提供的建議為一般指南,特定的工作負載可能需要使用特定的調整。
適用於 HDInsight 互動式查詢叢集 (LLAP) 的 Azure 預設 VM 類型
節點類型 | 執行個體 | 大小 |
---|---|---|
前端 | 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) | 指定的 Tez 容器大小 (以 MB 為單位) |
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) | 啟用 SSD 快取時,每個 LLAP 精靈的快取大小 (以 MB 為單位) |
hive.auto.convert.join.noconditionaltask.size | 2048 (MB) | 執行對應聯結的記憶體大小 (以 MB 為單位) |
LLAP 架構/元件:
LLAP 精靈大小估算:
1.決定節點上所有容器的總 YARN 記憶體配置
設定:yarn.nodemanager.resource.memory-mb
此值表示每個節點上 YARN 容器可使用的記憶體最大總和 (以 MB 為單位)。 指定值應小於該節點上的實體記憶體總數。
單一節點上所有 YARN 容器的記憶體總數 = (實體記憶體總數 – OS + 其他服務所使用的記憶體)
請將此值設定為約可用 RAM 大小的 90%。
針對 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 和在背景工作節點上執行的其他服務。
D14 v2 VM 上具有 16 vcores
,而 LLAP 精靈容器可使用 16 vcores
中的 75%。
針對 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 設定變數 hive.server2.tez.sessions.per.default.queue
的 Ambari UI 滑桿:
5.Tez Container 與 Tez Application Master 的大小
設定:tez.am.resource.memory.mb, hive.tez.container.size
tez.am.resource.memory.mb - 定義 Tez Application Master 的大小。
建議值為 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 Application Master (Tez AM) 所需的記憶體可以下列方式計算。
Tez AM 會做為查詢協調器,且應根據要提供服務的多個並行查詢數目來設定 Tez AM 數目。 理論上,我們可以假設每個背景工作節點有一個 Tez AM。 不過,您可能會發現背景工作節點上有多個 Tez AM。 基於計算目的,我們假設所有 LLAP 精靈節點/背景工作節點的 Tez AM 皆平均分佈。
建議每個 Tez AM 都要有 4 GB 的記憶體。
Tez AM 的數目 = Hive 設定 hive.server2.tez.sessions.per.default.queue 所指定的值。
LLAP 精靈節點數目 = Ambari UI 中 env 變數 num_llap_nodes_for_llap_daemons 所指定的值。
Tez AM 容器大小 = Tez 設定 tez.am.resource.memory.mb 所指定的值。
每個節點的 Tez AM 記憶體 = ( ceil ( Tez AM 數目 / 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 記憶體) - (Service Master 容器大小)
其中一個背景工作節點上繁衍的叢集僅會有一個 Service Master (LLAP 服務的 Application Master)。 基於計算目的,我們假設一個背景工作節點有一個 Service Master。
針對 D14 v2 背景工作節點,HDI 4.0 - 建議值為 (85 GB - 4 GB - 1 GB)) = 80 GB
8.決定每個 LLAP 精靈的執行程式數目
設定:hive.llap.daemon.num.executors、hive.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 額外負荷的部分堆積外記憶體 (Metaspace、執行緒堆疊、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:
停用 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 選取範圍的閾值,Hive 最佳化工具會考量來自其他執行程式過度訂閱的記憶體,讓記憶體內部雜湊資料表有更多空間以允許更多對應聯結轉換。 考慮每個執行程式有 3 GB,此大小可以過度訂閱 3 GB,但其他作業也可能將某些堆積記憶體用於排序緩衝區、隨機緩衝區等。
因此,針對 D14 v2,每個具有 3 GB 記憶體的執行程式,建議將此值設定為 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)。
num_llap_nodes_for_llap_daemons - 指定僅用於 LLAP 精靈的節點數目。 LLAP 精靈容器大小會設定為符合最大大小的節點,因此每個節點上會產生一個 llap
精靈。
建議將這兩個值保持與 Interactive Query 叢集中的背景工作節點數目相同。
工作負載管理的考量事項
如果您想要啟用 LLAP 的工作負載管理,請確保您保留足夠的容量以讓工作負載如預期般運作。 工作負載管理需要自訂 YARN 佇列的設定,意即 llap
佇列以外的設定。 請務必根據您的工作負載需求,分配 llap
佇列與工作負載管理佇列之間的叢集資源容量總計。
當啟動資源計劃時,工作負載管理會繁衍 Tez Application Masters(Tez AM)。
注意:
- 啟用資源計劃時繁衍的 Tez AM 會因由
hive.server2.tez.interactive.queue
指定而從工作負載管理佇列取用資源。 - Tez AM 的數目會取決於資源計劃中指定的
QUERY_PARALLELISM
值。 - 工作負載管理處於使用中後,將不會使用 LLAP 佇列中的 Tez AM。 僅會使用工作管理負載佇列中的 Tez AM 進行查詢協調。 當停用工作負載管理時,會使用
llap
佇列中的 Tez AM。
例如:叢集容量總計 = 100 GB 記憶體,分配於 LLAP、工作負載管理和預設佇列,如下所示:
- LLAP 佇列容量 = 70 GB
- 工作負載管理佇列容量 = 20 GB
- 預設佇列容量 = 10 GB
在工作負載管理佇列容量中有 20 GB 的情況下,資源計劃可以將 QUERY_PARALLELISM
指定為五,這表示工作負載管理可以啟動五個 4 GB 容器大小的 Tez AM。 如果 QUERY_PARALLELISM
大於容量,則您可能會看到某些 Tez AM 停止回應並處於 ACCEPTED
狀態。 Hive Server 2 Interactive 無法將查詢片段提交至未處於 RUNNING
狀態的 Tez AM。
後續步驟
如果設定這些值無法解決問題,請瀏覽下列任一項目...
透過 Azure 社群支援獲得由 Azure 專家所提供的解答。
與 @AzureSupport 連繫:專為改善客戶體驗而設的官方 Microsoft Azure 帳戶,可協助 Azure 社群連接至適當的資源,例如解答、支援及專家。
如果需要更多協助,您可在 Azure 入口網站提交支援要求。 從功能表列中選取 [支援] 或開啟 [說明 + 支援] 中樞。 如需詳細資訊,請參閱如何建立 Azure 支援要求。 Microsoft Azure 訂用帳戶包括訂用帳戶管理及帳務支援的存取權,而技術支援由其中一項 Azure 支援方案提供。
其他參考資料:
- Configure other LLAP properties (設定其他 LLAP 屬性)
- Configure the Hive server heap size (設定 Hive 伺服器堆積大小)
- Map Join Memory Sizing for LLAP (調整 LLAP 的對應聯結記憶體大小)
- Tez Execution Engine Properties (Tez 執行引擎屬性)
- Hive LLAP deep dive (Hive LLAP 深入探討)