疑難排解 Hive LLAP 工作負載管理問題
啟動 HDInsight 4.0 叢集的客戶可以使用工作負載管理 (WLM)。 使用下列資源來協助偵錯與 WLM 功能相關的問題。
取得 WLM 資源方案和計畫實體
要取得叢集上的所有資源計劃:
SHOW RESOURCE PLANS;
取得指定資源計劃的定義
SHOW RESOURCE PLAN <plan_name>;
從中繼存放區資料庫取得 WLM 實體資訊
注意
僅適用於自訂 Hive 中繼存放區資料庫
也可以從 Hive 中繼存放區資料庫中的下表檢視 WLM 實體資訊
- WM_RESOURCEPLANS (NAME 字串、STATUS 字串、QUERY_PARALLELISM int、DEFAULT_POOL_PATH 字串)
- WM_POOLS (RP_NAME 字串、PATH 字串、ALLOC_FRACTION double、QUERY_PARALLELISM int、SCHEDULING_POLICY 字串)
- WM_MAPPINGS (RP_NAME 字串、ENTITY_TYPE字串、ENTITY_NAME 字串、POOL_PATH 字串、ORDERING int)
- WM_TRIGGERS (RP_NAME字串、NAME 字串、TRIGGER_EXPRESSION 字串、ACTION_EXPRESSION 字串)
- WM_POOLS_TO_TRIGGERS (RP_NAME 字串、POOL_PATH 字串、TRIGGER_NAME 字串)
WLM 計量
WLM 計量可以直接透過 [計量傾印] 索引標籤下的 HS2Interactive
UI 來存取。
WLM 針對資源計劃中指定集區發佈的範例計量。
"name" : "Hadoop:service=hiveserver2,name=WmPoolMetrics.etl",
"modelerType" : "WmPoolMetrics.etl",
"tag.Context" : "HS2",
"tag.SessionId" : "etl",
"tag.Hostname" : "hn0-c2b-ll.cu1cgjaim53urggr4psrgczloa.cx.internal.cloudapp.net",
"NumExecutors" : 10,
"NumRunningQueries" : 2,
"NumParallelQueries" : 3,
"NumQueuedQueries" : 0,
"NumExecutorsMax" : 10
HS2Interactive
UI 不適用於 2021 年 4 月之前發行的 ESP (企業安全性套件) 啟用之叢集。 在這種情況下,可以從自訂 Grafana 儀表板取得 WLM 相關計量。
計量名稱會遵循下列模式:
default.General.WM_<pool>_numExecutors
default.General.WM_<pool>_numExecutorsMax
default.General.WM_<pool>_numRunningQueries
default.General.WM_<pool>_numParallelQueries
default.General.WM_<pool>_numQueuedQueries
將 <pool>
取代為個別集區名稱,以取得 grafana 中的計量。
注意:請確定已在上述篩選條件和元件名稱中選取 hiveserver2 元件。
WLM 功能特徵
已啟用 WLM 叢集中 Tez VM 的生命週期
相較於預設 LLAP 叢集,已啟用 WLM 的叢集有另一組 Tez AMS。 如果 hive.server2.tez.interactive.queue=wm 是在登錄區設定中設定,這些 Tez AM 會排定在 wm
佇列中執行。
這些 Tez AMS 會在 WLM 根據資源計劃中定義之所有集區 QUERY_PARALLELISM 的總和啟動時繁衍。
當我們停用叢集中的工作負載管理時,這些 Tez AMS 會自動「終止」。
{ DISABLE WORKLOAD MANAGEMENT; }
資源爭用
在已啟用 WLM 的 LLAP 叢集中,資源會根據資源計劃設定在查詢間分享。 資源分享有時會減緩查詢。
您可以對資源計劃進行一些調整,來減少在集區內爭奪資源。 例如 scheduling_policy
,可以定義為 fair
保證叢集上資源與指派給集區的每個查詢共用相等,或 fifo
其保證所有資源都會傳送到集區的第一個查詢。
下列範例示範如何為資源計劃 wlm_basic
中名為 etl
的集區設定排程原則:
ALTER POOL wlm_basic.etl SET SCHEDULING_POLICY = fair;
您也可以在建立集區時設定排程原則:
CREATE POOL wlm_basic.default WITH ALLOC_FRACTION = 0.5, QUERY_PARALLELISM = 2, SCHEDULING_POLICY = fifo;
針對特定使用案例的失敗查詢
WLM 中執行查詢可能會針對下列情況自動終止:
- 當 [移動觸發程序] 套用至沒有任何 Tez AM 可用的查詢和目的地集區時,則會改為終止查詢。
上述是 WLM 功能的設計限制。 您可以藉由增加目的地集區的QUERY_PARALLELISM
屬性來解決此問題,即使達到最大負載案例,此集區仍可支援提交至叢集的查詢。 此外,調整wm
佇列大小以配合這項變更。 - 停用 WLM 時,所有傳遞查詢都會失敗,並出現下列例外狀況模式:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Dag received [DAG_TERMINATE, DAG_KILL] in RUNNING state.
- 手動終止 WLM Tez AM 時,某些查詢可能會失敗並出現下列模式。
這些查詢應該在重新提交時執行,而不會發生任何問題。
java.util.concurrent.CancellationException: Task was cancelled.
at com.google.common.util.concurrent.AbstractFuture.cancellationExceptionWithCause(AbstractFuture.java:1349) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:550) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:513) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:90) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly(Uninterruptibles.java:237) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.Futures.getDone(Futures.java:1064) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.java:1013) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:30) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1137) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture.complete(AbstractFuture.java:957) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture.cancel(AbstractFuture.java:611) ~[guava-28.0-jre.jar:?]
at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.cancel(AbstractFuture.java:118) ~[guava-28.0-jre.jar:?]
at org.apache.hadoop.hive.ql.exec.tez.WmTezSession$TimeoutRunnable.run(WmTezSession.java:264) ~[hive-exec-3.1.3.4.1.3.6.jar:3.1.3.4.1.3.6]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_275]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_275]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) ~[?:1.8.0_275]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[?:1.8.0_275]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_275]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_275]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_275]
已知問題
如果目標 LLAP 叢集已啟用 WLM 功能,則透過 Hive Warehouse Connector (HWC) 提交的 Spark 工作可能會遇到間歇性失敗。
為了避免上述問題,客戶可以有兩個 LLAP 叢集,一個已啟用 WLM,另一個則沒有 WLM。 接著,客戶可以使用 HWC 將其 Spark 叢集連結到沒有 WLM 的 LLAP 叢集。DISABLE WORKLOAD MANAGEMENT;
命令有時候會停止回應。
取消命令,並使用下列命令檢查資源計劃狀態:SHOW RESOURCE PLANS;
再次執行命令之前,請檢查使用中的資源計劃是否可用DISABLE WORKLOAD MANAGEMENT
;某些 Tez AM 可以繼續執行,而且不會因為
DISABLE WORKLOAD MANAGEMENT
命令或 HS2 重新開機而消失。
在停用工作負載管理之後,透過yarn UI
或yarn console application
終止這些 Tez AM。