排查 Hive LLAP 工作负载管理问题
启动 HDInsight 4.0 群集的客户可以使用工作负载管理 (WLM)。 可使用以下资源来帮助调试 WLM 功能相关的问题。
获取 WLM 资源计划和计划实体
若要获取群集上的所有资源计划,请运行以下代码:
SHOW RESOURCE PLANS;
若要获取给定资源计划的定义,请运行以下代码:
SHOW RESOURCE PLAN <plan_name>;
从元存储数据库获取 WLM 实体信息
注意
仅适用于自定义 Hive 元存储数据库
还可以通过 Hive 元存储数据库中的以下表查看 WLM 实体信息
- WM_RESOURCEPLANS (NAME string, STATUS string, QUERY_PARALLELISM int, DEFAULT_POOL_PATH string)
- WM_POOLS (RP_NAME string, PATH string, ALLOC_FRACTION double, QUERY_PARALLELISM int, SCHEDULING_POLICY string)
- WM_MAPPINGS (RP_NAME string, ENTITY_TYPE string, ENTITY_NAME string, POOL_PATH string, ORDERING int)
- WM_TRIGGERS (RP_NAME string, NAME string, TRIGGER_EXPRESSION string, ACTION_EXPRESSION string)
- WM_POOLS_TO_TRIGGERS (RP_NAME string, POOL_PATH string, TRIGGER_NAME string)
WLM 指标
可直接通过“指标转储”选项卡下的 HS2Interactive
UI 访问 WLM 指标。
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 AM 的生命周期
与默认的 LLAP 群集相比,已启用 WLM 的群集具有另一组 Tez AM。 如果在 Hive 配置中设置了 hive.server2.tez.interactive.queue=wm,则这些 Tez AM 将计划为在 wm
队列中运行。
基于资源计划中定义的所有池的 QUERY_PARALLELISM 之和激活 WLM 后,将会生成这些 Tez AM。
在群集中禁用工作负载管理时,会自动终止这些 Tez AM。
{ 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。