栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Apache Impala 3.4.0 —— Admission Control and Query Queuing(动态资源池)实践

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Apache Impala 3.4.0 —— Admission Control and Query Queuing(动态资源池)实践

主题:记录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文件配置内容。




    
  
    
    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 
  
第三步:修改启动impalad参数

编辑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可以支持当前所有查询。具体请根据业务场景斟酌参数值,最好循序渐进改动,寻找真正适合自身业务场景的参数值。

3. < rule name=“specified” create=“false” / > 含义

该配置决定是否允许DDL/DML 指定特定队列 进行提交

4. < rule name=“default” / > 含义

默认提交队列,如果未指定“queue”属性,则默认提交到“root.default”队列中,因此实际同

5. 资源池可配参数汇总
术语llama-site含义
Max Running Queriesllama.am.throttling.maximum.placed.reservations.root.资源池名资源池上允许的最大查询并发数,该池子上的任何超过最大并发查询数的查询都会进入队列中等待,直到其他查询结束才会启动执行。当Max Running Queries Multiple有设置时,这个配置不生效。
Max Running Queries Multipleimpala.admission-control.max-running-queries-multiple.root.资源池名float值,其值乘以executor impalad 个数就是Max Running Queries,结果是向上取整,因此结果至少为1。如果这个配置被设置为0或者负数,则无效。
Max Queued Queriesllama.am.throttling.maximum.queued.reservations.root.资源池名资源池上允许的最大队列大小。当Max Queued QueriesMultiple有设置时,这个配置不生效。
Max Queued Queries Multipleimpala.admission-control.max-queued-queries-multiple.root.资源池名类似Max Running Queries Multiple,不过设置的是资源等待队列大小
Queue Timeoutimpala.admission-control.pool-queue-timeout-ms.root.资源池名查询请求等待资源时间最大值,超过此值则超时退出
Max Memory Multipleimpala.admission-control.max-memory-multiple.root.资源池名单位为bytes,其值乘以executorimpalad 个数就是Max Memory,如果这个配置被设置为0或者负数,则无效。
Minimum Query Memory Limitimpala.admission-control.min-query-mem-limit.root.资源池名每个Impalad executor节点分配给该查询的最大内存值
Maximum Query Memory Limitimpala.admission-control.max-query-mem-limit.root.资源池名每个Impalad executor节点分配给该查询的最小内存值
Clamp MEM_LIMIT Query Optionimpala.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 Limitimpala.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/

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/583386.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号