Share via


疑難排解 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 來存取。
HS2 Interactive 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 中的計量。

Grafana WLM metrics.

注意:請確定已在上述篩選條件和元件名稱中選取 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 中執行查詢可能會針對下列情況自動終止:

  1. 當 [移動觸發程序] 套用至沒有任何 Tez AM 可用的查詢和目的地集區時,則會改為終止查詢。
    上述是 WLM 功能的設計限制。 您可以藉由增加目的地集區的 QUERY_PARALLELISM 屬性來解決此問題,即使達到最大負載案例,此集區仍可支援提交至叢集的查詢。 此外,調整 wm 佇列大小以配合這項變更。
  2. 停用 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.
    
  3. 手動終止 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 UIyarn console application 終止這些 Tez AM。