Azure HDInsight Interactive Query 群集 (Hive LLAP) 大小调整指南
本文档介绍了 HDInsight Interactive Query 群集(Hive LLAP 群集)典型工作负载的大小调整,以实现合理的性能。 注意,本文档中提供的建议是通用准则,特定的工作负载可能需要进行特定的调整。
HDInsight Interactive Query 群集 (LLAP) 的 Azure 默认 VM 类型
节点类型 | 实例 | 大小 |
---|---|---|
Head | 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 | 资源管理器中每个容器请求的最大 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
此值指示资源管理器上每个容器请求的最大分配 (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 vcores
个 16 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”。
Hive 配置变量的 Ambari UI 滑块hive.server2.tez.sessions.per.default.queue
:
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% 的容量应该是可以的。 但是,如果工作负荷是使用托管表的更新/删除/合并操作的混合,建议为 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 中环境变量 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 守护程序容器可用的总内存量。 每工作器节点的执行程序数可以超额订阅可用 vcore 的 120%。 但是,如果它不满足每个执行程序所需的内存和 LLAP 守护程序容器大小的内存要求,则应进行调整。
每个执行程序都等效于一个 Tez 容器,可以使用 4 GB(Tez 容器大小)的内存。 LLAP 守护程序中的所有执行程序共用相同的堆内存。 假设并非所有执行程序都同时运行内存密集型操作,你可以考虑使每个执行程序使用 Tez 容器大小 (4 GB) 的 75%。 这样,你可以通过为每个执行程序分配较少的内存(例如 3 GB)来增加并行度,从而增加执行程序数。 但是,建议针对你的目标工作负载优化此设置。
D14 v2 VM 上有 16 个 vCore。 对于 D14 v2,每个工作器节点上的执行程序数的建议值为(16 个 vcore 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 开销(元空间、线程堆栈、gc
数据结构等)。 通常,此开销大约是堆大小 (Xmx) 的 6%。 为了安全起见,此值可计算为总 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 缓存的元数据。 元数据存储在内存中,预计约为 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.调整映射联接内存
配置: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) 的节点。
num_llap_nodes_for_llap_daemons - 仅用于 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。
后续步骤
如果需要更多帮助,可以从 Azure 门户提交支持请求。 从菜单栏中选择“支持”,或打开“帮助 + 支持”中心。 有关更多详细信息,请参阅如何创建 Azure 支持请求。 世纪互联 Azure 订阅包含对订阅管理和计费支持的访问权限,通过 Azure 支持计划之一提供技术支持。
其他参考: