Impala包含一些特性,可以在CDH集群中平衡和最大化资源。本章将说明如何使用Impala提升CDH集群的利用效率。
创建静态服务池
使用静态服务池可以给Impala和其他服务分配专用的资源,以考虑到预计的资源需求。
静态服务池将服务彼此隔离开来,因此一个高负载的服务对其他服务的影响是有限的。你可以使用CM来配置静态服务池,控制内存,CPU和磁盘I/O。
l HDFS通常最少需要5-10%的资源
l 一般,Yarn和Impala分割余下的资源总量:
对于绝大部分批处理负载的应用,可能需要分配Yarn的资源为60%,Impala为30%,并且HDFS为10%;
对于绝大部分为Ad hoc查询负载来说,可能需要分配Impala的资源为60%,Yarn为30%,并且HDFS为10%。
使用准入控制
因为静态服务池的限制,你需要使用准入控制功能来更加细分Impala的资源。你可以在CM的动态资源池页面中配置Impala的准入控制池。
在多租户的使用案例中,你使用准入控制划分动态资源池的使用。合理明智地分配资源可以让重要的查询更快更可靠的执行。
一个动态资源池有如下属性:
l Max Running Queries:指定资源池中,查询进入排队前的最大并发数
l Max Memory Resources:指定资源池中,查询进入排队前的最大内存使用量
l Default Query Memory Limit:每个节点给每个查询最大分配的内存使用大小,这样对于集群来说,一个查询可以使用的最大内存为MEM_LIMIT * 节点数。
l Max Queued Queries:资源池中最大的排队的查询数,超过此大小的查询将被拒绝。
l Queue Timeout:设置排队的查询可以等待多久,超时的查询将被取消。
设置每个查询的内存限制
使用每个查询的内存限制是为了防止查询消耗过多的内存资源而影响其他查询。强烈建议设置查询的内存限制。
如果你对一个资源池设置了“Pool Max Mem Resources”,那么查询没有足够的内存执行时,Impala将尝试压制此查询。
典型的情况是,你可以使用“set MEM_LIMIT=Xg;”查询选项来设置内存限制,具体大小的设置可以根据业务场景找到一个适合的值,这样基于内存的准入控制能够更好的工作。同样也会存在潜在的缺点,就是尝试去使用更多内存的查询可能会被取消或执行效率很低。
为了去寻找一个合理的默认查询内存限制:
1. 运行负载
2. 在Cloudera Manager,选择Impala > Queries
3. 单击“Select Attributes”
4. 从弹出的对话框中选择“Per Node Peak Memory Usage”(每个节点的内存使用峰值),然后点击“Update”
5. 允许系统时间去收集信息,然后点击“Show Histogram”图标去查看结果:
6. 使用直方图去分析绝大部分查询语句,发现一个比较合适的内存大小。针对那些需要更多内存的查询(超过限制的内存大小),我们可以显式地设置内存限制大小以确保查询可以运行完成。
创建动态资源池
动态资源池是用来配置及用于在池中运行的 YARN 应用程序或 Impala 查询之间安排资源的策略。动态资源池允许你基于用户访问指定池的权限,调度和分配资源给Impala的查询使用。
为Impala创建一个生产的动态资源池:
1. 在Cloudera Manager,选择Clusters> Dynamic Resource Pool Configuration
2. 点击ImpalaAdmission Control选项
3. 点击CreateResource Pool
4. 指定生产的资源池的名称和资源限制大小:
a. 在“Resource Pool Name”中,输入“Production”
b. 在“Max Memory”中,输入48000
c. 在“Default Query Memory Limit“中,输入1600(每个节点)
d. 在“Max Running Queries”中,输入10
e. 在“Max Queued Queries”中,输入200
f. 在“Queue Timeout”中,输入3(minutes)
5. 点击Create
6. 点击RefreshDynamic Resource Pools
对于上面的设置,生产队列中可以同时运行10个Impala查询语句。如果总的内存请求超过48000MB,它将查询放到队列中,直到内存释放,这样就阻止了运行的查询需要的内存超过可用的内存大小的情况。
为Impala创建一个开发的动态资源池:
1. 在Cloudera Manager,选择Clusters> Dynamic Resource Pool Configuration
2. 点击ImpalaAdmission Control选项
3. 点击CreateResource Pool
4. 指定开发的资源池的名称和资源限制大小:
a. 在“Resource Pool Name”中,输入“Development”
b. 在“Max Memory”中,输入24000
c. 在“Default Query Memory Limit“中,输入8000
d. 在“Max Running Queries”中,输入1
e. 在“Max Queued Queries”中,输入100
f. 在“Queue Timeout”中,输入2(minutes)
5. 点击Create
6. 点击RefreshDynamic Resource Pools
关于放置规则
放置规则决定了每个查询如何映射到一个资源池中。标准的设置是当指定时就使用一个指定的资源池,否则使用默认的资源池。
比如,你可以使用SET语句设置使用哪一个资源池用来查询语句:
SET REQUEST_POOL=Production;
设置资源池上的权限控制
你可以指定哪些用户和组可以被允许去使用创建好的资源池。
为Impala创建一个开发的动态资源池:
1. 在Cloudera Manager中,选择Clusters> Dynamic Resource Pool Configuration
2. 点击ImpalaAdmission Control 选项
3. 选择Production Pool,点击Edit按钮修改
4. 点击SubmissionAccess Control 选项
5. 选择Allowthese users and groups to submit to this pool
6. 以逗号分隔,输入用户列表,指定这些用户访问指定的资源池
7. 点击Save