首页 > 代码库 > 用HAWQ轻松取代传统数据仓库(十三) —— 资源管理
用HAWQ轻松取代传统数据仓库(十三) —— 资源管理
一、HAWQ如何管理资源
HAWQ使用多种机制管理CPU、内存、I/O、文件句柄等系统资源,包括全局资源管理、资源队列、强制资源使用限额等。1. 全局资源管理
Hadoop通常使用YARN全局管理资源。YARN是一个通用的资源管理框架,为MapReduce作业或其它配置了YARN的应用提供资源。在YARN环境中,资源分配的单位被称为容器(container),YARN还能强制限制每个集群节点上的可用资源。图1展示了Hadoop YARN环境下的HAWQ集群布局。可以将HAWQ配置为一个在YARN中注册的应用,执行查询时,HAWQ的资源管理器与YARN通信以获取所需的资源。之后HAWQ master主机上的资源管理器管理分配这些从YARN获得的资源。当资源使用完成时返还给YARN。
2. HAWQ资源队列
资源队列是HAWQ系统中并发管理的主要工具,它是一种数据库对象,可以使用CREATE RESOURCE QUEUE语句创建。资源队列控制可以并发执行的活跃查询数量,以及为每种查询类型分配的最大内存、CUP数量。资源队列还可以限制一个查询消耗的资源总量,避免个别查询使用过多的资源而影响系统整体的性能。HAWQ内部基于资源队列层次系统动态管理资源。资源队列的数据结构为一棵n叉树,如图2所示。
HAWQ初始化后有一个根队列pg_root和一个缺省的队列pg_default。如果使用YARN模式,HAWQ资源管理器自动从全局资源管理器获得根队列资源。当创建了一个新的资源队列时,必须指定其父队列,以这种方式将所有资源队列组织到一棵树中。
执行查询时,进行编译和语义分析后,优化器与HAWQ资源管理器协调查询的资源使用情况,得到基于可用资源的优化的查询计划。查询分发器将每个查询的资源分配与查询计划一同发送给segment。这样,segment上的查询执行器(QE)就知道当前查询的资源配额,并在整个执行过程中使用这些资源。查询结束或终止后,资源返还给HAWQ资源管理器。
资源队列树中,只有叶子队列可以被授予角色和接受查询。资源分配策略如下:
- 只为正在运行或排队的查询分配资源队列。
- 多个查询竞争时,HAWQ资源管理器自动依据可用资源情况平衡队列间的资源。
- 在一个资源队列中,如果有多个查询等待资源,最终资源以Best-Effort方式分配给每个查询。
二、资源管理器配置最佳实践
配置资源管理时可以使用下面HAWQ给出的的实践原则,保证高效的资源管理和最佳系统性能:- segment节点没有相同的IP地址。某些软件使用自动配置IP地址的虚拟网卡,这可能造成某些HAWQ segment得到相同的IP地址。这种情况下,资源管理器的容错服务组件只能认到相同IP中的一个segment。
- 所有segment配置相同的资源容量配额。
- 为了避免资源碎片化,配置segment资源配额为所有虚拟段资源限额的整数倍。
- 确保有足够已注册的segment响应资源请求。如果失效的segment超过了限制,资源请求被拒绝。
- master和segment使用多个独立的大磁盘(2T或以上)的临时目录,例如/disk1/tmp /disk2/tmp,保证写临时文件的负载均衡。对于给定查询,HAWQ为每个虚拟段使用一个单独的临时目录存储溢出文件。多个HAWQ会话也是用自己的临时目录避免磁盘竞争。如果临时目录过少,或者多个临时目录存储在同一个磁盘上,会增加磁盘竞争或磁盘空间用尽的风险。
- 最小化每个segment的YARN容器数,并设置空闲资源返还YARN的超时时间。
- yarn.scheduler.minimum-allocation-mb参数设置成可以被1G整除,如1024、512等。
三、独立资源管理器
HAWQ中的资源管理器配置主要涉及以下几个方面:- 确定使用哪种资源管理模式。HAWQ支持两种管理模式:独立模式与外部全局资源管理器模式。独立模式也叫无全局资源管理模式。在该模式下,HAWQ使用集群节点资源时,不考虑其它共存的应用,HAWQ假设它能使用所有segment的资源。对于专用HAWQ集群,独立模式是可选的方案。当前HAWQ支持YARN作为外部全局资源管理器。该模式下,HAWQ作为一个YARN的应用,使用YARN管理的集群资源。
- 如果选择独立资源管理模式,需要决定是否限制分配给每个HAWQ segment使用的内存与CPU。
- 如果使用YARN模式,需要在YARN中为HAWQ配置资源队列,还要在HAWQ进行与YARN相关的配置。HAWQ自动注册为YARN应用,使用YARN中配置的资源队列。
- 在HAWQ中,创建资源队列。
1. 使用独立模式
为了配置HAWQ运行独立资源管理模式,在master上的hawq-site.xml文件中设置以下属性:<property> <name>hawq_global_rm_type</name> <value>none</value> </property>该属性为全局设置,需要重启HAWQ以生效。当然也可以使用ambari,在HAWQ->Configs->Resource Manager进行设置,然后重启HAWQ服务。
hawq_global_rm_type参数代表HAWQ全局资源管理类型,有效值为yarn和none。设置为none表示由HAWQ的资源管理器自己管理资源。设置为yarn意味着与YARN协调使用资源。缺省安装时使用的是独立模式。
[gpadmin@hdp3 ~]$ hawq config -s hawq_global_rm_type GUC : hawq_global_rm_type Value : none [gpadmin@hdp3 ~]$
2. 配置segment资源限制
使用独立模式(hawq_global_rm_type=none)时,可以限制每个HAWQ segment所能使用的资源。配置方法是在hawq-site.xml文件中增加以下参数:<property> <name>hawq_rm_memory_limit_perseg</name> <value>8GB</value> </property> <property> <name>hawq_rm_nvcore_limit_perseg</name> <value>4</value> </property>hawq_rm_memory_limit_perseg参数设置独立资源管理模式下,每个HAWQ segment使用的最大内存数。hawq_rm_nvcore_limit_perseg参数设置每个HAWQ segment使用的最大CPU虚拟核数。
因为XML的配置验证,在YARN模式下也需要设置这些属性,即使该模式下不会使用这些参数。所有segment都配置成相同的值,内存应该设置成1G的倍数。并且为了降低形成资源碎片的可能性,hawq_rm_memory_limit_perseg应该配置成所有虚拟段资源限额(通过资源队列的VSEG_RESOURCE_QUOTA配置)的倍数。例如,hawq_rm_memory_limit_perseg设置成15G,但是虚拟段资源限额设置成2G,那么一个segment可以使用的最大内存只有14G。
3. 配置查询语句的资源限额
某些场景下,可能需要在查询语句级增加资源限额。以下配置属性允许用户通过修改相应的资源队列控制限额:- hawq_rm_stmt_vseg_memory
- hawq_rm_stmt_nvseg
db1=# set hawq_rm_stmt_vseg_memory=‘256mb‘; SET db1=# set hawq_rm_stmt_nvseg=10; SET db1=# create table t(i integer); CREATE TABLE db1=# insert into t values(1); INSERT 0 1 db1=#HAWQ是动态为给定查询语句分配资源的,资源管理器只是分配segment的资源,而不会为查询保留资源。并且,语句级设置的虚拟段数不要超过全局配置参数hawq_rm_nvseg_perquery_limit的值。
4.配置最大虚拟段数
可以在服务器级限制语句执行时使用的虚拟段数,这能防止数据装载期间的资源瓶颈或过渡消耗资源带来的性能问题。在Hadoop集群中,NameNode和DataNode可以并发打开的写文件数是有限制的,考虑下面的场景:- 需要向有P个分区的表导入数据。
- 集群中有N个节点,为了导入数据,每个节点上启动了V个虚拟段。
为了缓解NameNode的负载,使用下面的服务器配置参数限制V的大小,即每个节点启动的最大虚拟段数。
- hawq_rm_nvseg_perquery_limit:在服务器级别上限制执行一条语句可以使用的最大虚拟段数量,缺省值为512。default_hash_table_bucket_number定义的哈希桶数不能超过hawq_rm_nvseg_perquery_limit。
- default_hash_table_bucket_number:定义哈希表使用的缺省桶数。查询哈希表时,分配给查询的虚拟段数是固定的,等于表的桶数。一般集群扩容后应当调整此参数。
四、整合YARN
HAWQ支持YARN作为全局资源管理器。在YARN管理的环境中,HAWQ动态向YARN请求资源容器,资源使用完成后返还YARN。此特性让HAWQ有效利用Hadoop的资源管理能力,并使HAWQ成为Hadoop生态圈的一员。总的来说,可以使用以下步骤整合YARN与HAWQ:- 安装YARN。如果使用HDP 2.3版本,必须设置yarn.resourcemanager.system-metrics-publisher.enabled=false。
- 配置YARN使用CapacityScheduler调度器,并为HAWQ保留一个单独的应用队列。
- 启用YARN的高可用特性(可选)。
- 配置HAWQ的YARN模式。
- 根据需要调整HAWQ的资源使用:为HAWQ修改相应的YARN资源队列配额(刷新YARN资源队列不需要重启HAWQ);通过修改HAWQ资源队列进行资源消耗的细粒度控制;其它配置,如设置每个HAWQ segment的最小YARN容器数,或修改HAWQ的空闲资源超时时间等。
1. 配置YARN
查询请求资源执行时,HAWQ的资源管理器与YARN的资源调度器协商资源分配。查询执行完毕后,HAWQ资源管理器向YARN调度器返回占用的资源。为了使用YARN,最好为HAWQ配置独立的应用资源队列。YARN为特定的资源调度器配置资源队列,调度器根据资源队列的配置为应用分配资源。目前HAWQ仅支持YARN的Capacity调度器。下面的例子说明如何使用ambari配置CapacityScheduler作为YARN的调度器。
(1)登录ambari
(2)选择YARN -> Configs -> Advanced -> Scheduler,如图3所示
图3
(3)在yarn.resourcemanager.scheduler.class输入框中输入以下值:org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler该属性值设置YARN的调度器为Capacity。
(4)在Capacity Scheduler输入框中输入以下内容:
yarn.scheduler.capacity.maximum-am-resource-percent=0.2 yarn.scheduler.capacity.maximum-applications=10000 yarn.scheduler.capacity.node-locality-delay=40 yarn.scheduler.capacity.root.acl_administer_queue=* yarn.scheduler.capacity.root.capacity=100 yarn.scheduler.capacity.root.queues=mrque1,mrque2,hawqque yarn.scheduler.capacity.root.hawqque.capacity=20 yarn.scheduler.capacity.root.hawqque.maximum-capacity=80 yarn.scheduler.capacity.root.hawqque.state=RUNNING yarn.scheduler.capacity.root.hawqque.user-limit-factor=1 yarn.scheduler.capacity.root.mrque1.capacity=30 yarn.scheduler.capacity.root.mrque1.maximum-capacity=50 yarn.scheduler.capacity.root.mrque1.state=RUNNING yarn.scheduler.capacity.root.mrque1.user-limit-factor=1 yarn.scheduler.capacity.root.mrque2.capacity=50 yarn.scheduler.capacity.root.mrque2.maximum-capacity=50 yarn.scheduler.capacity.root.mrque2.state=RUNNING yarn.scheduler.capacity.root.mrque2.user-limit-factor=1缺省的Capacity调度策略只有一个名为default的资源队列。以上属性在根队列下设置两个MapReduce队列和一个名为hawqque的HAWQ专用队列,三个队列并存,共享整个集群资源。hawqque队列可以使用整个集群20%到80%的资源。表1说明了队列配置的主要属性及其含义。
属性名称 | 描述 |
yarn.scheduler.capacity.maximum-am-resource-percent | 集群中可用于运行application master的资源比例上限,通常用于限制并发运行的应用程序数目。示例中设置为0.2,即20%。 |
yarn.scheduler.capacity.maximum-applications | 集群中所有队列同时处于等待和运行状态的应用程序数目上限,这是一个强限制,一旦集群中应用程序数目超过该上限,后续提交的应用程序将被拒绝,默认值为10000。 |
yarn.scheduler.capacity.node-locality-delay | 调度器尝试调度一个rack-local container之前,最多跳过的调度机会。通常该值被设置成集群中机架数目,缺省值为40,接近一个机架中的节点数目。 |
yarn.scheduler.capacity.<queue_name>.queues | 定义本队列下的资源队列。即资源队列树中某节点的直接下级节点。 |
yarn.scheduler.capacity.<queue_name>.capacity | 一个百分比的值,表示队列占用整个集群的百分之多少比例的资源。 |
yarn.scheduler.capacity.<queue_name>.maximum-capacity | 弹性设置,队列最多占用多少比例的资源。 |
yarn.scheduler.capacity.<queue_name>.state | 队列状态,可以是RUNNING或STOPPED。 |
yarn.scheduler.capacity.<queue_name>.user-limit-factor | 每个用户的低保百分比,比如设置为1,则表示无论有多少用户在跑任务,每个用户占用最低不会少于1%的资源。 |
(5)保存配置并重启YARN服务,之后可以在YARN资源管理器的用户界面看到配置的三个队列,如图4所示。
图4
2. 在YARN中设置segment资源限制
与独立资源管理模式类似,也可以通过YARN管理HAWQ segment的配额。HAWQ推荐将所有segment设置成相同的资源配额。在yarn-site.xml文件中设置如下属性:<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>4GB</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>1</value> </property>或者使用ambari的YARN -> Configs -> Settings进行配置,yarn.nodemanager.resource.memory-mb和yarn.nodemanager.resource.cpu-vcores的设置分别如图5、图6所示。
图6
- yarn.nodemanager.resource.memory-mb:表示该节点上YARN可使用的物理内存总量,默认是8192MB。如果节点的内存资源不够8GB,则需要调减小这个值,YARN不会智能的探测节点的物理内存总量。
- yarn.nodemanager.resource.cpu-vcores:表示该节点上YARN可使用的虚拟CPU个数,默认是8。目前推荐将该值设值为与物理CPU核数相同。如果节点的CPU核数不够8个,则需要调减小这个值,YARN不会智能的探测节点的物理CPU总数。
- yarn.nodemanager.resource.memory-mb应该设置为虚拟段资源限额(在HAWQ资源队列中配置)的倍数。
- 每核内存应该设置为yarn.scheduler.minimum-allocation-mb的倍数。
- yarn.scheduler.minimum-allocation-mb=1024
- yarn.nodemanager.resource.memory-mb=49152
- yarn.nodemanager.resource.cpu-vcores=16
3. 启用YARN模式
配置完YARN,就可以在hawq-site.xml文件中添加如下属性,将YARN启用为HAWQ的全局资源管理器。<property> <name>hawq_global_rm_type</name> <value>yarn</value> </property>或者使用ambari的HAWQ -> Configs -> Settings -> Resource Management 进行配置,如图7所示。
图7
这样HAWQ资源管理器只会使用YARN分配的资源。YARN模式的HAWQ需要在hawq-site.xml文件中配置以下属性:
<property> <name>hawq_rm_yarn_address</name> <value>hdp2:8050</value> </property> <property> <name>hawq_rm_yarn_scheduler_address</name> <value>hdp2:8030</value> </property> <property> <name>hawq_rm_yarn_queue_name</name> <value>hawqque</value></property> <property> <name>hawq_rm_yarn_app_name</name> <value>hawq</value> </property>或者使用ambari的HAWQ -> Configs -> Advanced -> Advanced hawq-site 进行配置,如图8所示。
图8
表2包含了相关属性的描述。属性名称 | 描述 |
hawq_rm_yarn_address | YARN服务器的主机和端口号,与yarn-site.xml中的yarn.resourcemanager.address属性相同。 |
hawq_rm_yarn_scheduler_address | YARN调度器的主机和端口号,与yarn-site.xml中的yarn.resourcemanager.scheduler.address属性相同。 |
hawq_rm_yarn_queue_name | YARN中HAWQ使用的资源队列名称。 |
hawq_rm_yarn_app_name | YARN中HAWQ使用的应用名称。 |
表2
4. 用YARN协调HAWQ资源
为了保证资源管理的效率与查询性能,应该做适当的配置,协调YARN为HAWQ资源管理器分配资源。(1)调整每个segment的最小YARN容器数
当HAWQ刚注册到YARN,还没有工作负载时,HAWQ不需要立即获得任何资源。只有在HAWQ接收到第一个查询请求时,HAWQ资源管理器才开始向YARN请求资源。为保证为后续查询优化资源分配,同时避免与YARN协调过于频繁,可以调整hawq_rm_min_resource_perseg参数。无论初始查询的大小,每个HAWQ segment都至少会被分配指定的YARN容器数。该参数的缺省值为2,这意味着即便查询所需的资源很少,HAWQ资源管理器为每个segment至少获得两个YARN容器。
此属性配置不能超过YARN中HAWQ资源队列的配额。例如,如果YARN中HAWQ队列的配额不大于整个集群的50%,并且每个YARN节点的最大内存与虚拟CPU核数分别为64GB和16,那么hawq_rm_min_resource_perseg的设置不能大于8。这是因为HAWQ资源管理器通过虚拟CPU核数获得YARN资源容器。
(2)设置YARN资源超时
如果HAWQ的工作负载很低,HAWQ资源管理器已经获得的YARN资源有可能出现空闲的情况。可以调整hawq_rm_resource_idle_timeout参数,让HAWQ资源管理器更快或更慢地向YARN返还空闲资源。例如,HAWQ资源管理器获取资源的过程会造成查询延时。为了让HAWQ资源管理器更长时间持有已获资源,以备后面的查询工作使用,可增加hawq_rm_resource_idle_timeout的值。该参数的缺省值为300秒。
五、资源队列层次
通过定义层次化的资源队列,系统管理员能够根据需要均衡分配系统资源。资源队列是使用CREATE RESOURCE QUEUE语句创建的数据库对象,是HAWQ系统中管理并发度的主要工具。可以使用资源队列控制并发执行的活跃查询的数量,以及分配给每种查询类型使用的最大内存与CPU数量。资源队列还可以防止某些查询因消耗太多系统资源,影响系统整体性能的情况。HAWQ内部将资源队列组织为一棵如图2所示的n叉树。HAWQ初始化后,有一个名为pg_root的根队列,根下有一个名为pg_default的缺省队列,图2中用灰色节点表示。
1. 设置资源队列最大数
可以配置HAWQ集群中允许的资源队列最大数量,缺省值为128,值域范围是3 - 1024。[gpadmin@hdp3 ~]$ hawq config -s hawq_rm_nresqueue_limit GUC : hawq_rm_nresqueue_limit Value : 128 [gpadmin@hdp3 ~]$手工编辑hawq-site.xml文件或使用ambari界面配置该参数,新值在HAWQ重启后生效。下面例子将最大资源队列数设置成50。
<property> <name>hawq_rm_nresqueue_limit</name> <value>50</value> </property>执行以下命令检查运行时的参数设置:
db1=# show hawq_rm_nresqueue_limit; hawq_rm_nresqueue_limit ------------------------- 128 (1 row)该参数不能在服务器启动后动态改变:
db1=# set hawq_rm_nresqueue_limit=50; ERROR: attempted change of parameter "hawq_rm_nresqueue_limit" ignored DETAIL: This parameter cannot be changed after server start. db1=#
2. 资源队列维护
(1)创建资源队列使用CREATE RESOURCE QUEUE语句创建资源队列。只有管理员用户才能运行该DDL语句。创建资源队列时需要指定队列的名称、父队列名称、CPU和内存限制等,还能可选限制队列中的活跃语句数量。
下面的语句在pg_root下创建一个名为myqueue的资源队列,限制活跃查询数为20,内存和CPU核数最多为集群总量的10%:
db1=# create resource queue myqueue with (parent=‘pg_root‘, active_statements=20, db1(# memory_limit_cluster=10%, core_limit_cluster=10%); CREATE QUEUE db1=#一个父队列下的所有直接子队列的资源限制总和不能超过100%。例如,缺省的pg_default队列的memory_limit_cluster和core_limit_cluster为50%,刚刚建立的myqueue两者限制为10%,两个队列的限制总和是60%,此时无法再在pg_root下创建限制超过40%的资源队列。
db1=# create resource queue myqueue1 with (parent=‘pg_root‘, active_statements=20, db1(# memory_limit_cluster=50%, core_limit_cluster=50%); ERROR: the value of core_limit_cluster and memory_limit_cluster exceeds parent queue‘s limit, wrong value = http://www.mamicode.com/50%> 下面的语句在pg_root下创建一个名为test_queue_1的资源队列,内存和CPU核数最多为集群总量的40%,并指定资源过度使用因子为2:db1=# create resource queue test_queue_1 with (parent=‘pg_root‘, db1(# memory_limit_cluster=30%, core_limit_cluster=30%, resource_overcommit_factor=2); CREATE QUEUE db1=#RESOURCE_OVERCOMMIT_FACTOR是一个可选属性,定义有多少资源能够被过度使用,缺省值为2.0,最小值为1.0。如果设置RESOURCE_OVERCOMMIT_FACTOR为3.0,同时将MEMORY_LIMIT_CLUSTER设置为30%,那么最大可能的资源分配为90%(30% * 3)。如果资源限制与RESOURCE_OVERCOMMIT_FACTOR相乘的结果值大于100%,采用100%。
(2)修改资源队列
使用ALTER RESOURCE QUEUE语句修改资源队列。只有管理员用户才能运行该DDL语句。该语句可以修改队列的资源限制和活跃语句数,但不能改变一个队列的父队列,创建资源队列时的约束同样适用于修改语句。
可以在队列正在被使用时进行修改,所有队列中排队的资源请求都调整为基于修改后的队列。在修改队列时,排队的资源请求可能遇到某些冲突,如可能发生资源死锁,或者修改后的资源限额不能满足排队的请求等。为防止冲突,缺省情况下HAWQ会取消与新资源队列定义冲突的所有请求,该行为受服务器配置参数hawq_rm_force_alterqueue_cancel_queued_request控制,缺省设置是on。[gpadmin@hdp3 ~]$ hawq config -s hawq_rm_force_alterqueue_cancel_queued_request GUC : hawq_rm_force_alterqueue_cancel_queued_request Value : on [gpadmin@hdp3 ~]$如果该参数设置为off,如果资源管理器发现新的队列定义与排队请求发生冲突,则取消ALTER RESOURCE QUEUE中指定的限制。
以下语句修改资源队列的内存和CPU核数限制:db1=# alter resource queue test_queue_1 with (memory_limit_cluster=40%,core_limit_cluster=40%); ALTER QUEUE db1=#以下语句将资源队列的最大活跃语句数由缺省的20改为50:db1=# alter resource queue test_queue_1 with (active_statements=50); ALTER QUEUE db1=#
(3)删除资源队列
使用DROP RESOURCE QUEUE语句删除一个资源队列。只有管理员用户才能运行该DDL语句。满足以下条件的资源队列才能被删除:
- 没有查询正在使用该队列。
- 没有子队列。
- 没有被赋予角色。
以下语句从资源队列中删除角色(角色会被移到缺省的pg_default资源队列中):
db1=# alter role wxy resource queue none; ALTER ROLE db1=#以下语句删除myqueue资源队列。
db1=# drop resource queue myqueue; DROP QUEUE db1=#
(4)检查现有资源队列
HAWQ的系统表pg_resqueue保存资源队列数据。下面的查询语句显示test_queue_1的相关信息:
db1=# \x Expanded display is on. db1=# select rsqname, db1-# parentoid, db1-# activestats, db1-# memorylimit, db1-# corelimit, db1-# resovercommit, db1-# allocpolicy, db1-# vsegresourcequota, db1-# nvsegupperlimit, db1-# nvseglowerlimit, db1-# nvsegupperlimitperseg, db1-# nvseglowerlimitperseg db1-# from pg_resqueue db1-# where rsqname=‘test_queue_1‘; -[ RECORD 1 ]---------+------------- rsqname | test_queue_1 parentoid | 9800 activestats | 50 memorylimit | 40% corelimit | 40% resovercommit | 2 allocpolicy | even vsegresourcequota | mem:256mb nvsegupperlimit | 0 nvseglowerlimit | 0 nvsegupperlimitperseg | 0 nvseglowerlimitperseg | 0 db1=#也可以从pg_resqueue_status系统视图检查资源队列的运行时状态:
db1=# select * from pg_resqueue_status; rsqname | segmem | segcore | segsize | segsizemax | inusemem | inusecore | rsqholders | rsqwaiters | paused --------------+--------+----------+---------+------------+----------+-----------+------------+------------+-------- pg_root | 256 | 0.125000 | 72 | 72 | 0 | 0.000000 | 0 | 0 | F pg_default | 256 | 0.125000 | 36 | 72 | 0 | 0.000000 | 0 | 0 | F test_queue_1 | 256 | 0.125000 | 28 | 57 | 0 | 0.000000 | 0 | 0 | F (3 rows)表3描述了pg_resqueue_status视图中各字段的含义。
字段名称 | 描述 |
rsqname | HAWQ资源队列名称。 |
segmem | 每个虚拟段内存限额(MB)。 |
segcore | 每个虚拟段的CPU虚拟核数限额。 |
segsize | 资源队列能够为执行查询分配的虚拟段数。 |
segsizemax | 过度使用其它队列的资源时,资源队列可为执行查询分配的最大虚拟段数。 |
inusemem | 当前运行的语句使用的总内存(MB)。 |
inusecore | 当前运行的语句使用的总CPU虚拟核数。 |
rsqholders | 并发运行的语句数量。 |
rsqwaiters | 排队语句的数量。 |
paused | 指示在没有资源状态改变时,资源队列是否临时性暂停。‘F’表示否,‘T’表示是,‘R’表示资源队列发生了资源碎片问题。 |
表3
下面的语句查询所有资源队列的当前活动SQL:select usename, rsqname, locktype, objid, transaction, pid, mode, granted, waiting from pg_stat_activity, pg_resqueue, pg_locks where pg_stat_activity.procpid=pg_locks.pid and pg_locks.objid=pg_resqueue.oid;下面的语句查询所有资源队列的当前等待SQL:
select rolname, rsqname, pid, granted, current_query, datname from pg_roles, pg_resqueue, pg_locks, pg_stat_activity where pg_roles.rolresqueue=pg_locks.objid and pg_locks.objid=pg_resqueue.oid and pg_stat_activity.procpid=pg_locks.pid;
3. 给角色赋予资源队列
资源队列对资源的管理是通过角色(用户)发挥作用的。角色被赋予某个资源队列,用该角色执行的查询受相应资源队列的限制。只允许为角色赋予叶子队列。下面的语句在创建或修改角色时赋予角色一个资源队列:
db1=# create role rmtest1 with login resource queue pg_default; CREATE ROLE db1=# alter role rmtest1 resource queue test_queue_1; ALTER ROLE db1=#下面的语句查看为角色分配的资源队列:
db1=# select rolname, rsqname from pg_roles, pg_resqueue db1-# where pg_roles.rolresqueue=pg_resqueue.oid; rolname | rsqname ---------+-------------- gpadmin | pg_default wxy | pg_default rmtest1 | test_queue_1 (3 rows)
六、查询资源管理器状态
通过一些查询能够导出资源管理器的细节信息,如活跃资源上下文状态、当前资源队列状态、HAWQ segment状态等。1. 连接状态跟踪
查询执行时从资源管理器请求分配资源,此时会有一个连接跟踪实例,记录查询资源使用的整个生命周期,从中可以找到所有的资源请求与分配情况。下面的查询获取保存连接跟踪状态信息的文件路径:db1=# select * from dump_resource_manager_status(1); dump_resource_manager_status ----------------------------------------------------------------------------------------- Dump resource manager connection track status to /tmp/resource_manager_conntrack_status (1 row)表4总结了该文件中的输出字段及其描述。
字段名称 | 描述 |
Number of free connection ids | 空闲的连接跟踪实例数量。HAWQ资源管理器支持最多65536个活动连接跟踪实例。 |
Number of connection tracks having requests to handle | 资源管理器已经接受但还没有处理的请求数量。 |
Number of connection tracks having responses to send | 资源管理器已经生成但还没有发送出去的响应数量。 |
SOCK | 请求的socket连接信息。 |
CONN | 请求的角色名称、目标队列和当前状态等信息。 prog=1表示连接建立 prog=2连接由用户注册 prog=3表示连接等待目标队列中的资源。 prog=4表示资源已经分配给连接。 prog>5表示失败或异常状态。 |
ALLOC | 会话相关信息,如请求的资源、会话级资源限制、语句级资源设置、按查询计划分片数估计的工作量等等。 |
LOC | 查询扫描HDFS的数据本地化信息。 |
RESOURCE | 已经分配的资源信息。 |
MSG | 最后收到的消息。 |
COMMSTAT | 当前socket通信缓冲区状态。 |
表4
2. 资源队列状态
下面的查询获取保存资源队列状态信息的文件路径:db1=# select * from dump_resource_manager_status(2); dump_resource_manager_status -------------------------------------------------------------------------------------- Dump resource manager resource queue status to /tmp/resource_manager_resqueue_status (1 row)表5总结了该文件中的输出字段及其描述。
字段名称 | 描述 |
Maximum capacity of queue in global resource manager cluster | YARN资源队列最大配额。 |
Number of resource queues | HAWQ资源队列总数量。 |
QUEUE | 资源队列的基本结构信息,以及是否忙于为查询调度资源。 |
REQ | 等待队列的计数和状态。 |
SEGCAP | 虚拟段资源限额和可派发的虚拟段数量。 |
QUECAP | 原始资源队列配额,以及一个队列可以使用的集群资源的实际百分比。 |
QUEUSE | 资源队列使用信息。 |
表5
3. HAWQ segment状态
下面的查询获取保存HAWQ segment状态信息的文件路径:db1=# select * from dump_resource_manager_status(3); dump_resource_manager_status ------------------------------------------------------------------------------------ Dump resource manager resource pool status to /tmp/resource_manager_respool_status (1 row)表6总结了该文件中的输出字段及其描述。
字段名称 | 描述 |
HOST_ID | 识别的segment名称和内部ID。 |
HOST_INFO | segment配置的资源配额。GRMTotalMemoryMB和GRMTotalCore显示YARN报告的限额,FTSTotalMemoryMB和FTSTotalCore显示HAWQ中配置的限额。 |
HOST_AVAILABILITY | segment对于HAWQ容错服务(fault tolerance service,FTS)和YARN是否可用。 |
HOST_RESOURCE | 当前分配的和可用的资源,以及估算的负载计数器。 |
HOST_RESOURCE_CONTAINERSET | Segment持有的资源容器。 |
表6
用HAWQ轻松取代传统数据仓库(十三) —— 资源管理