Azure HDInsight Interactive Query 群集 (Hive LLAP) 大小调整指南

本文档介绍了 HDInsight Interactive Query 群集(Hive LLAP 群集)典型工作负载的大小调整,以实现合理的性能。 注意,本文档中提供的建议是通用准则,特定的工作负载可能需要进行特定的调整。

HDInsight Interactive Query 群集 (LLAP) 的 Azure 默认 VM 类型

节点类型 实例 大小
D13 v2 8 个 vcpus,56 GB 内存,400 GB 固态硬盘
工人 D14 v2 16 vcpus,112 GB RAM,800 GB SSD
动物园管理员 A4 v2 4 个 vcpus,8GB 内存,40GB 固态硬盘

注意:所有建议的配置值都基于 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 资源管理器中每个容器请求的最大 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 <工作节点数量> 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 Architecture/Components`。

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

此值指示资源管理器上每个容器请求的最大分配 (MB)。 高于此指定值的内存请求将不会生效。 资源管理器可以按“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

此值指示资源管理器中每个容器请求的最大虚拟 CPU 内核数。 请求的 vcores 数大于此值将不会生效。 这是 YARN 计划程序的全局属性。 对于 LLAP 守护程序容器,此值可以设置为总可用 vcores 的 75%。 剩余的 25% 应保留给在工作器节点上运行的 NodeManager、DataNode 和其他服务。
D14 v2 VM 上总共有 16 vcores16 vcores,在这 16 个 vCore 中,LLAP 守护程序容器可使用 75% 的 vCore。
对于 D14 v2,建议的值为“12”。

4.并发查询数

配置:hive.server2.tez.sessions.per.default.queue

此配置值确定可以并行启动的 Tez 会话数。 将为“hive.server2.tez.default.queues”指定的每个队列启动这些 Tez 会话。它对应于 Tez-AM(查询协调器)的数量。 建议使用与工作器节点数相同的值。 Tez AM 的数量可以大于 LLAP 守护程序节点的数量。 Tez AM 的主要职责是协调查询执行,并将查询计划片段分配给相应的 LLAP 守护程序执行。 将此值保持为多个 LLAP 守护程序节点的倍数,以实现更高的吞吐量。

默认 HDInsight 群集有四个 LLAP 守护程序在四个工作器节点上运行,因此建议的值为“4”。

Ambari UI 中用于 Hive 配置变量的滑块hive.server2.tez.sessions.per.default.queue

`LLAP最大并发查询数`。

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% 的容量应该是可以的。 但是,如果您的工作负载是使用托管表进行更新/删除/合并操作的组合,建议将 85% 的容量分配给 LLAP 队列。 剩余 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。 为了计算目的,我们假定 Tez AM 在所有 LLAP 守护进程节点/工作节点上均匀分布。 建议为每个 Tez AM 配置 4 GB 内存。

Tez Am 数 = 由 Hive 配置 hive.server2.tez.sessions.per.default.queue 指定的值。
LLAP守护程序的节点数 = Ambari UI 中环境节点 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 内存) - (服务主机容器大小)
在其中一个工作器节点上生成的群集上只有一个服务主机(LLAP 服务的应用程序主机)。 为了进行计算,我们假定每个工作器节点上有一个服务主机。
对于 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 守护程序可以并行执行任务的执行器数量。 此值取决于 vCore 的数量、每个执行程序使用的内存量以及 LLAP 守护程序容器可用的总内存量。 可将每个工作节点的执行程序数量超额分配至可用虚拟核心的 120%。 但是,如果它不满足每个执行程序所需的内存和 LLAP 守护程序容器大小的内存要求,则应进行调整。

每个执行程序都等效于一个 Tez 容器,可以使用 4 GB(Tez 容器大小)的内存。 LLAP 守护程序中的所有执行程序共用相同的堆内存。 假设并非所有执行程序都同时运行内存密集型操作,你可以考虑使每个执行程序使用 Tez 容器大小 (4 GB) 的 75%。 这样,你可以通过为每个执行程序分配较少的内存(例如 3 GB)来增加并行度,从而增加执行程序数。 但是,建议针对你的目标工作负载优化此设置。

D14 v2 虚拟机上有 16 个 vCPU。 对于 D14 v2,考虑到每个执行程序 3 GB 的内存,每个工作节点上执行程序数量的建议值为(16 个 vcore x 120%)~= 19

hive.llap.io.threadpool.size
此值指定执行程序的线程池大小。 由于根据指定,执行程序数量是固定的,因此此值与每个 LLAP 守护程序的执行程序数量相同。
对于 D14 v2,建议的值为“19”。

9.确定 LLAP 守护程序缓存大小

配置:hive.llap.io.memory.size

LLAP 守护程序容器内存包含以下部分;

  • 余量
  • 执行程序使用的堆内存 (Xmx)
  • 每个守护程序的内存中缓存(其堆外内存大小,启用 SSD 缓存时不适用)
  • 内存中缓存元数据大小(仅当启用 SSD 缓存时适用)

空余空间大小:此大小表示有一部分堆外内存用于 Java VM 开销(元空间、线程堆栈、gc 数据结构等)。 通常,此开销大约是堆大小 (Xmx) 的 6%。 为了安全起见,此值可计算为总 LLAP 守护程序内存大小的 6%。
对于 D14 v2,建议的值为 ceil(80 GB x 0.06) ~= 4 GB。

堆大小 (Xmx) :它是可供所有执行程序使用的堆内存量。 总堆大小 = 执行器数量 x 3 吉字节
对于 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 缓存的元数据。 元数据存储在内存中,预计约为 SSD 缓存大小的 8%。
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.调整Map Join内存

配置:hive.auto.convert.join.noconditionaltask.size

确保已启用 hive.auto.convert.join.noconditionaltask,以便此参数生效。 此配置用于确定 Hive 优化器在选择 MapJoin 时的阈值,该优化器会考虑到其他执行程序的内存超分配情况,从而为内存中的哈希表预留更多空间,以便进行更多的映射联接转换。 假定每个执行器 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 服务主机和 Tez 应用程序主机 (Tez AM) 的节点。

`LLAP 服务的节点数`。
num_llap_nodes_for_llap_daemons - 仅用于 LLAP 守护程序的指定节点数。 LLAP 守护程序容器大小设置为“最大适用”节点,因此在每个节点上都有一个 llap 守护程序。

`LLAP 守护进程的节点数`。

建议使两个值都与 Interactive Query 群集中的工作器节点数相同。

工作负载管理注意事项

如果要为 LLAP 启用工作负载管理,请确保保留足够的容量以便工作负载管理按预期方式工作。 工作负载管理需要配置自定义 YARN 队列,该队列是 llap 队列的补充。 请确保根据工作负载要求,在 llap 队列与工作负载管理队列之间划分总群集资源容量。 激活资源计划后,工作负载管理会生成 Tez 应用程序主机 (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 值指定为 5,这意味着工作负载管理可以启动五个 Tez AM,每个容器大小分别为 4 GB。 如果 QUERY_PARALLELISM 高于该容量,某些 Tez AM 可能会在 ACCEPTED 状态下停止响应。 Hive Server2 Interactive 无法将查询片段提交到未处于 RUNNING 状态的 Tez AM。

后续步骤