Impala实战 第6章 Impala管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/myvanguard/article/details/86651784

6.1准入控制和查询队列

准入控制是Impala的一个功能。准入控制功能为高并发查询避免内存不足提供了有利的保障。

6.1.1准入控制概述

在一个繁忙的CDH集群上,我们可以通过不断的实验找到一个并发执行的查询的最佳数目。

6.1.2准入控制和YARN

准入控制功能在一定程度上和YARN资源管理框架很类似,他们可以分别单独使用,也可以一起使用。本部分内容将介绍它们的差异,为我们以何种方式来管理资源提供帮助。
准入控制是一个轻量级的去中心化的系统,它适用于系统的主要负载来自于Impala查询的集群。
使用准入控制来控制集群中Impala作业对并发和内存的消耗,而使用YARN来控制Hadoop其他组件的资源消耗。
我们可以将YARN、Impala、Llama一起使用,其中YARN管理所有的集群资源,以Llama作为媒介所有的Imapla查询也从YARN中请求资源。YARN是一个集中管理的更加通用的资源管理服务。Impala通过YARN申请资源将要比准入控制具有更高的延迟,因为它必须通过Llama向YARN提交并返回请求。

在ClouderaManager中,如果我们没有启用Llama角色,Impala将使用准入控制单独对资源进行管理。如果启用了Llama角色,YARN将通过Llama来控制Impala的资源管理。

6.1.3并发查询限制

在设置内存限制时,我们可以设置一个略小于我们预期的值;而在设置等待队列大小时,我们可以设置一个略大于我们预期的值。

6.1.4准入控制和Impala客户端协同工作

准备控制对JDBCODBC这样的客户端接口是透明的:
(1)如果SQL语句被放入等待队列,而不是立即执行,API调用会一直阻塞到语句从等待队列出现并开始执行的时候。也就是说客户端应用可能立即接收到返回的结果,也可能一直阻塞等待返回结果。
(2)如果SQL语句由于超出队列长度限制或者内存限制被终止执行,客户端应用程序将会接收到一条描述性错误信息。
在使用了JDBC或者ODBC的应用程序中,准入控制有如下限制和特殊的行为:
(1)如果我们想通过REQUEST_POOL参数将查询提交到不同的资源池,REQUEST_POOL参数必须在impala-shell的会话级别设置,或者在集群侧启动impalad进程时设置。
(2)使用MEMLIMIT参数有时可以解决Impala对复杂查询的内存消耗估算不准确的问题,但是这个参数只能通过impala-shell来设置,无法通过JDBC或者ODBC直接设置。
(3)准入控制不能使用像 RESERVATION REQUEST_TIMEOUT或者V CPU CORES等资源相关的参数。这些参数只对基于YARN管理的资源管理框架有效。

6.1.5配置准入控制

准入控制的基本配置很简单,比如我们可以只配置一个资源池和一组参数集合。如果要做到精细化的控制,配置可能要稍微复杂一些,比如我们要使用不同配置参数的多个资源池,每个资源池捕获特定用户或者组的查询请求。要完成这些配置,我们可以直接使用Cloudera Manager进行配置,也可以直接编辑配置文件或者控制impalad进程的启动参数来进行配置。
1.使用Cloudera Manager 配置

2.手动配置
可以通过修改配置文件 fair-scheduler.xml和llama-site.xml,并修改impalad进程的启动参数来实现。对于一个只使用单个资源池(默认名称为default)的简单配置,我们可以不配置fair-scheduler.xml和llama-site.xml,只配置命令行参数。
impalad 进程与准入控制相关的参数说明如下:

(1)–default_pool_max_queued等待队列允许的最大请求的数目。
(2)–default_pool_max_requests该参数表示Impala允许的并行执行的查询的最大个数。
(3)–default_pool_mem_limit该参数表示所有并发执行的查询可以消耗的内存的最大值。
(4)–disable_admission_control该参数表示关闭准入控制功能。
(5)–disable_pool_max_requests该参数表示禁用所有的资源池对并发查询请求个数的限制。
(6)–disable_pool_mem_limits该参数禁用所有资源池对内存的限制。
(7)–fair_scheduler_allocation_path该参数指定公平调度器配置文件fair-scheduler.xml的路径。
(8)–llama_site_path该参数指定Llama配置文件llama-site.xml的路径。
(9)–queue_wait timeout_ms该参数表示一个请求被接受之前需要等待的最长毫秒数。

对于更高级的使用多资源池的配置,我们需要手动修改fair-scheduler.xml和llama-site.xml配置文件。同时在Impalad进程的命令行参数中配置-fair_scheduler_allocation path和-llama_site_path 选项指定参数文件的位置。

6.1.6使用准入控制指导原则

为了确认准入控制是否对查询生效,我们可以检查查询的PROFILE的输出。在impala-shell中执行完一个查询之后立刻运行PROFILE,在Impala调试的web界面或者在日志文件中,我们就可以看到相关信息。这些信息包括像查询是否进入了等待队列,使用了哪个资源池等准入控制的相关信息。它还包括了估算的内存消耗和真实的内存消耗,通过这些信息我们可以很好的调整资源池的内存限制参数。

6.2使用VARN资源管理(CDH5)

在CDH5中,Impala也可以运行在基于YARN的资源管理的框架之下,由YARN负责为每个Impala查询分配资源。
Impala负责计算每个查询需要的资源,并向YARN提交申请。
通过Impala向YARN申请资源的请求使用过Llama服务调用进行的。如果Impala的资源请求被允许,那么它将所有的执行线程放入Cgroup容器,为每个节点设置内存限制并启动查询。

6.2.1 Llama进程

Llama 是位于Cloudera Impala和Hadoop YARN之间的资源管理系统。Llama可以控制Impala预留、使用、释放从Hadoop集群申请的资源。如果要使用YARN对Impala进行资源管理,Llama是必须的。

6.2.2检查计算的资源和实际使用的资源

为了使资源使用情况便于确认,SQL的EXPLAIN命令输出的执行计划包括了关于内存估算情况,表和列统计信息是否可用,查询将要使用的虚拟核数等信息。

6.2.3资源限制如何生效

CPU的限制通过Linux的Cgroup机制实现。YARN为与各机器关联的Cgroup组的容器分配授权资源。

6.2.4启用impala资源管理

如果要启用Impala的资源管理,我们必须首先在集群中安装YARN和Llama服务。YARN是一个对Hadoop集群组件进行资源管理的通用服务,Llama是作为YARN和Impala之间资源管理的桥接服务:将Impala的查询请求发送到YARN,确保Impala在查询在执行之前能够从YARN申请到所有可用的资源。

接下来介绍一下Impala资源管理启动参数。以下是启用Impala 资源管理后的集群定制化参数:

  • -enablerm:是否启用资源管理。这是一个布尔型参数,默认值为FALSE。
  • -llama hostImpala需要连接到的Llama服务的主机名或者IP地址。默认值为127.0.0.1。
  • -llama port:Impala需要连接到的Llama服务的端口号。默认值为15000。
  • -cgroup hierarchy path:YARN和Llama需要创建的用于授权资源的Cgroup组的路径。

6.2.5资源管理相关impala-shell 参数

在通过impala-shell执行SQL之前,我们可以通过SET命令设定资源管理的相关参数有:

  • EXPLAIN LEVEL
  • MEM LIMIT
  • RESERVATION REQUEST TIMEOUT
  • V CPU CORES

6.2.6Impala资源管理的限制

目前,在CDH5中,对Impala查询有如下限制:

  • 表和列统计信息对于Impala估算这个查询请求需要的内存量是一个非常重要的参考
  • 当Impala为一个查询实际申请的内存超过它估算的内存时,这个查询将会终止执行。
  • MEMLIMIT和其他的查询参数一样,无法通过JDBC或者ODBC接口来控制。

6.3为进程,查询,会话设定超时限制

我们可以依据CDH集群的繁忙程度来增减不同的超时参数。

1.增加Statestore超时参数
我们需要将集群默认的10秒钟的超时时间改大。我们可以通过
-statestore_subscriber_timeout_seconds 参数来设定。

2.为impalad 设定空闲超时
为单独的查询或者整个会话设置超时时间。在impalad进程启动时,我们需要设置以下参数:

  • –idle_query_timeout:在超过了指定的时间后,空闲的查询将会被终止。
  • –idle_session_timeout:该参数用于指定空闲会话的超时时间。

6.4通过代理实现lmpala高可用性

对于一个繁忙的,有很大负载的一个集群来说,我们可以需要配置一个代理服务器来转发lmpala的请求。

如果要使用负载均衡技术,我们可以大致按照以下步骤进行:

  1. 下载负载均衡代理服务器软件,并进行安装。
  2. 对软件进行配置,设置用来转发Impala请求的相关配置信息。
  3. 指定每个Impala节点的主机名称和端口号。
  4. 使用相应的配置文件来启动代理服务器软件。

使用Kerberos如果集群启用了Kerberos,为了让Kerberos确认我们的连接请求的合法性,我们需要执行以下步骤:

  1. 确认集群启用了Kerberos。
  2. 确定我们将要使用的代理服务器的主机。
  3. 将keytab文件拷贝到所有的Impalad进程节点上。
  4. 为每台Impalad进程节点的keytab添加条目impala/actual_hostname@realm。
  5. 在每个impalad进程节点上,使用ktutil工具合并已存在的keytab和代理服务器的keytab,生成一个新的keytab文件。
  6. 确保impala用户对该文件有读权限。
  7. 修改每个参与负载均衡的impalad 进程节点的启动参数。
  8. 如果使用Cloudera Manager管理,则需要重启Impala服务。

2.HAProxy 配置示例。它是一个免费、开源的负载均衡器。

  1. 安装负载均衡器。yum install haproxy

  2. 设置配置文件haproxy.cfg。见稍后示例。

  3. 运行负载均衡器。(不要使用Impalad进程节点。)

    /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg

  4. 在impala-shell,JDBC是连接到代理服务器haproxy_host:25003。

6.5管理磁盘空间

可以通过文件清理释放空间,或者让开发者减少文件复制等尽可能少的消耗空间。

(1)在生产环境中使用二进制压缩文件。其中数字类型和时间日期类型压缩率较高。可以在CREATE TABLE时使用STORED AS选项或者使用ALTER TABLE时指定SET FILEFORMAT子句来改变表或者分区的存储格式。

(2)我们可以管理lmpala内部表和外部表的数据文件。
使用DESCRIBE FORMATTED语句来确认表是内部表还是外部表,在HDFS上的具体位置信息等。

对于Impala内部表,我们可以使用DROP TABLE命令删除数据文件。
对于Impala外部表,我们可以使用像hadoop fs、hdfs dfs、distcp等Hadoop相关的命令来创建、移动、拷贝或者删除文件。对HDFS上的文件操作执行完成之后,我们需要执行 REFRSH table_name命令更新外部表的元数据信息。

使用直接指向HDFS上原始数据文件的位置信息创建Impala的外部表可以有效的避免对数据文件的复制。我们可以把一个数据文件映射到多张Impala外部表。

当我们删除Impala外部表时,数据文件不会被级联删除。

使用LOADDATA命令将HDFS上的文件移动到Impala的数据目录时,无须指定要加载的目标位置信息。这项技术对于Impala的内部表和外部表都适用。

(3)确保HDFS的回收站信息正确配置。当我们从HDFS上删除文件之后,相应的空间可能由于回收站的配置而不被释放。

(4)在删除一个数据库之前请先删掉数据库中所有的表。

(5)在INSERT语句执行失败后及时清理临时文件。如果一个INSERT语句执行失败,我们可以在数据目录中看到一个名为impala.insert_staging的目录,这个目录包含插入数据的临时文件,会占用空间。使用DESCRIBE FORMATTED table_name 语句可以查看临时文件在HDFS上的位置信息。

猜你喜欢

转载自blog.csdn.net/myvanguard/article/details/86651784
今日推荐