目录主题:记录Apache Impala 3.4 动态资源池一次实践
背景:主要是发现集群查询经常出现Failed to get minimum memory reservation,即内存资源不足导致查询失败,此外某些小查询在集群出现大查询时被拖慢,因此希望利用动态资源池解决
成果:资源池配置成功,集群查询耗时P95下降明显,资源池应用后查询时间P95降至原来1/3,Failed to get minimum memory reservation未再出现 。
Tips:实现过程记录完整,希望能对读者有帮助,如果文中出现错误,希望能帮忙指出 。最后,如果有帮助的话,请给个赞激励下作者吧~
- 一、问题背景
- 二、问题起因
- 三、方案实践
- 第一步:统计表信息
- 第二步:编写资源池配置文件
- 第三步:修改启动impalad参数
- 第四步:重启impalad服务并执行查询
- 四、疑问
- 1. 如何查看当前Impala集群中各节点有多少节点,并且各节点可用内存资源是多少?
- 2. 如何确定llama-site.xml中的mem_limit应该设置多少?
- 3. < rule name="specified" create="false" / > 含义
- 4. < rule name="default" / > 含义
- 5. 资源池可配参数汇总
- 五、效果查看
Impala集群资源有限,查询经常提示Failed to get minimum memory reservation异常,即内存不足无法分配足够资源导致查询失败,尤其是在查询量集中的时段该异常出现次数更多。此外经常有过大查询占用过多集群资源,导致其他小查询被拖慢,本来1s的查询可能被拖慢到10s+。
二、问题起因在没有配置动态资源池的情况下,impala集群默认使用名为default的资源池,该资源池相关参数及含义如下:
- default_pool_max_queued(默认200)
Maximum number of requests allowed to be queued before rejecting requests. A negative value or 0 indicates requests will always be rejected once the maximum number of concurrent requests are executing. - default_pool_max_requests(默认-1)
Maximum number of concurrent outstanding requests allowed to run before queueing incoming requests. A negative value indicates no limit. 0 indicates no requests will be admitted. - default_pool_mem_limit(默认空,代表无限制)
Maximum amount of memory that all outstanding requests in this pool may use before new requests to this pool are queued. - queue_wait_timeout_ms(60000)
Maximum amount of time (in milliseconds) that a request will wait to be admitted before timing out.
以上四个参数分别设置了默认连接池参数,分别为 最大请求等待队列量(默认200),最大查询中请求数(默认不限制),最大池内存占用限制(默认同集群启动参数mem_limit),查询在等待队列中最长等待时间(默认60s)。
其中影响最大的是default_pool_mem_limit参数,在缺乏表/分区/列的统计信息时,Impala会预估一个内存使用值,并该值设置mem_limit,由于这个预估值在缺乏统计信息的情况下偏差较大,因此可能导致分配了过大内存/过小内存。
因此,问题归结为同一时间段大量查询集中打入,并且由于缺少统计信息引起的查询内存分配不合理,导致内存资源竞争问题严重,动态资源池通过限制每个查询单节点可用内存大小,并规定资源不足时查询排队策略来缓解此问题。
三、方案实践 第一步:统计表信息表统计信息可以通过 COMPUTE STATS 或 COMPUTE INCREMENTAL STATS获取
COMPUTE STATS:收集表中数据量、数据分布、 列信息 及 分区信息
COMPUTE INCREMENTAL STATS:能够针对 【某个分区】 实现表信息 增量 统计
Tips:一张表不能同时使用COMPUTE STATS或COMPUTE INCREMENTAL STATS,如果要更换统计信息,要先 DROP STATS / DROP INCREMENTAL STATS 删除原来的统计信息
推荐使用COMPUTE INCREMENTAL STATS增量得去统计每个分区的信息,比如在我们的应用场景下,日期为分区,每天会有导数任务搬运昨日数据,在导数任务结束之后就会针对分区执行COMPUTE INCREMENTAL STATS。
此外还在周末查询不集中的时间段针对过去1个月执行COMPUTE INCREMENTAL STATS,从过去一个月开始的数据都会有分区统计信息。
这样避免了随表数据量增长,COMPUTE STATS开销逐渐增大的问题。
Apache Impala Admission Control的实现需要依赖两个配置文件,分别是llama-site.xml和fair-schedule.xml,这两个配置文件在 impala根目录/conf/ 下是没有的,需要手动创建。
fair-schedule.xml文件配置内容。
2242560 mb, 0 vcores * 61440 mb, 0 vcores *
llama-site.xml文件配置内容。
第三步:修改启动impalad参数llama.am.throttling.maximum.placed.reservations.root.default 50 llama.am.throttling.maximum.queued.reservations.root.default 200 impala.admission-control.pool-default-query-options.root.default mem_limit=18432mb,query_timeout_s=400,exec_time_limit_s=300,DISABLE_UNSAFE_SPILLS=true impala.admission-control.pool-queue-timeout-ms.root.default 100000 impala.admission-control.max-query-mem-limit.root.default 19327352832 impala.admission-control.min-query-mem-limit.root.default 0 impala.admission-control.clamp-mem-limit-queryoption.root.default true llama.am.throttling.maximum.placed.reservations.root.small 5 llama.am.throttling.maximum.queued.reservations.root.small 20 impala.admission-control.pool-default-query-options.root.small mem_limit=2048mb,DISABLE_UNSAFE_SPILLS=true impala.admission-control.pool-queue-timeout-ms.root.small 0 impala.admission-control.max-query-mem-limit.root.default 2147483648 impala.admission-control.min-query-mem-limit.root.default 0 impala.admission-control.clamp-mem-limit-queryoption.root.default true
编辑impala根目录/default/impala文件,在启动参数项加入-fair_scheduler_allocation_path和-llama_site_path
IMPALA_SERVER_ARGS="
······
-fair_scheduler_allocation_path=apache-impala-3.4.0根目录/conf/fair-scheduler.xml
-llama_site_path=apache-impala-3.4.0根目录/conf/llama-site.xml"
第四步:重启impalad服务并执行查询
对所有Impala Coordinator都完成以上配置之后,重启Impala Coordinator节点的Impala服务即可。
然后在查询中通过SET REQUEST_POOL=资源池名称实现资源池指定
四、疑问 1. 如何查看当前Impala集群中各节点有多少节点,并且各节点可用内存资源是多少?在 http://cordinator节点IP:25000/backends 可以查看资源池情况。
2. 如何确定llama-site.xml中的mem_limit应该设置多少?apache impala提供了资源池信息统计相关的WebUI页面,地址为http://coordinator节点IP:25000/admission
我们可以在该页面看到一个Peak Memory Per Host图表,该图表展示了从impalad服务启动到目前为止总共接收了多少请求,并且这些查询占用的每节点最大内存是多少,实际设置mem_limit时比最大值高1g~2g就行,比如下图显示Peak Memory Per Host绝大部分为1g,最大Peak Memory Per Host为36g,因此配置文件中impala.admission-control.pool-default-query-options.root.default 一项mem_limit限定为37888mb(37g)。
Tips:这里设为37g可以支持目前的所有查询,当实际Peak Memory Per Host 36g 的查询连1%比率都不到,并且5g~36g之间出现了断层,但这里设为37g可以支持当前所有查询。具体请根据业务场景斟酌参数值,最好循序渐进改动,寻找真正适合自身业务场景的参数值。
该配置决定是否允许DDL/DML 指定特定队列 进行提交
默认提交队列,如果未指定“queue”属性,则默认提交到“root.default”队列中,因此实际同
5. 资源池可配参数汇总| 术语 | llama-site | 含义 |
|---|---|---|
| Max Running Queries | llama.am.throttling.maximum.placed.reservations.root.资源池名 | 资源池上允许的最大查询并发数,该池子上的任何超过最大并发查询数的查询都会进入队列中等待,直到其他查询结束才会启动执行。当Max Running Queries Multiple有设置时,这个配置不生效。 |
| Max Running Queries Multiple | impala.admission-control.max-running-queries-multiple.root.资源池名 | float值,其值乘以executor impalad 个数就是Max Running Queries,结果是向上取整,因此结果至少为1。如果这个配置被设置为0或者负数,则无效。 |
| Max Queued Queries | llama.am.throttling.maximum.queued.reservations.root.资源池名 | 资源池上允许的最大队列大小。当Max Queued QueriesMultiple有设置时,这个配置不生效。 |
| Max Queued Queries Multiple | impala.admission-control.max-queued-queries-multiple.root.资源池名 | 类似Max Running Queries Multiple,不过设置的是资源等待队列大小 |
| Queue Timeout | impala.admission-control.pool-queue-timeout-ms.root.资源池名 | 查询请求等待资源时间最大值,超过此值则超时退出 |
| Max Memory Multiple | impala.admission-control.max-memory-multiple.root.资源池名 | 单位为bytes,其值乘以executorimpalad 个数就是Max Memory,如果这个配置被设置为0或者负数,则无效。 |
| Minimum Query Memory Limit | impala.admission-control.min-query-mem-limit.root.资源池名 | 每个Impalad executor节点分配给该查询的最大内存值 |
| Maximum Query Memory Limit | impala.admission-control.max-query-mem-limit.root.资源池名 | 每个Impalad executor节点分配给该查询的最小内存值 |
| Clamp MEM_LIMIT Query Option | impala.admission-control.clamp-mem-limit-query-option.root.资源池名 | 在impala3.1及以上版本中这个配置默认为true。如果这个配置为false, 查询时MEM_LIMIT的配置不会受限于Minimum Query Memory Limit 和 Maximum Query Memory Limit。 |
| Default Query Memory Limit | impala.admission-control.pool-default-query-options.root.资源池名 | 当查询不指定MEM_LIMIT时,默认使用Default Query Memory Limit的值作为MEM_LIMIT |
在 http://cordinator节点IP:25000/admission 可以查看资源池情况。
下图中可以看出总共执行了11.6w次请求,没有请求出现等待资源超时/查过查询限制的请求。可以看到这里都是0,因此参数设置还算合理。
此外还需关注下单节点最大内存使用状况,在http://cordinator节点IP:25000/admission也可以看到,需要注意的是如果查询量较多,可以在http://cordinator节点IP:25000/admission?json通过json数据查看到准确数字,避免柱状图太小导致错漏。
比如下表基本上看不到横轴为14GB的柱状图,但从JSON数据中发现实际上是有4个查询Peak Memory Per Host达到了14GB,这与比最大Peak Memory Per Host=18GB小一些,因此可以继续修改llama_site.xml中的mem_limit参数。
资料:
http://impala.apache.org/docs/build/html/topics/impala_admission.html
http://impala.apache.org/docs/build/html/topics/impala_admission_config.html
https://www.bookstack.cn/read/impala-3.x-en/ba79c59a7a0b070f.md?wd=yarn
https://blog.csdn.net/qqqq0199181/article/details/103877322/



