了解Impala的同学都知道,Impala是一个典型的MPP架构,节点都是无状态的,随时可以拉起和停掉,所以我们可以方便地对整个集群进行扩容/缩容。但是在缩容的时候,会遇到一个问题:当节点上有SQL在跑的时候,如果我们直接停掉节点的话,那么这个节点上的所有SQL都会失败,这个对用户的影响还是非常不友好的。在物理机部署的时候,由于扩容/缩容操作相对比较小,所以这个问题影响较小。如果我们在使用容器化部署的时候,节点的上线和下线比较频繁,那这个影响比较大了。
Impala在3.x版本的时候提供了graceful shutdown的功能来解决这个问题。当我们使用graceful shutdown功能关闭节点的时候,该节点会等到SQL执行完之后(在一定时间内)再关闭服务,同时不再接受其他的请求。在介绍graceful shutdown功能之前,我们需要先说明以下两个相关的配置项:

  • shutdown_grace_period_s,默认为120s,表示节点在关闭之前至少会等待shutdown_grace_period_s这个时间间隔,用于进行一些信息的更新和同步,但是在此期间,节点也不会接受外部的请求;
  • shutdown_deadline_s,默认为3600s,表示节点一定会在这个时间间隔之后关闭,即使此时节点上仍然有SQL在跑,也会强制关闭;
    下面就结合使用和代码来看一下是Impala是如何实现这个graceful shutdown的功能。

使用方式

Impala目前提供了两种方式来执行graceful shutdown功能:提交SQL和执行脚本。我们就来一一看下这两种使用方式。

SHUTDOWN()函数

我们可以直接在coordinator节点上执行如下所示的函数来对指定的节点执行graceful shutdown,如下所示:

:SHUTDOWN()
:SHUTDOWN([host_name[:port_number] )
:SHUTDOWN(deadline)
:SHUTDOWN([host_name[:port_number], deadline)
  1. 不带任何参数表示关闭本节点,且使用的是配置的shutdown_grace_period_s和shutdown_deadline_s;
  2. 关闭指定的remote端节点,在3.1中使用的是be_port端口,默认是22000,在3.2及以上的版本中,使用的是krpc_port的端口,默认27000,需要注意;
  3. 关闭本地的节点,并且shutdown_deadline_s的值为deadline,可以使用表达式,例如:60*60;
  4. 关闭指定的remote端节点,并且shutdown_deadline_s的值为deadline;

当我们执行了相应的SQL之后,相应地输出如下所示:

其中executor是一个节点的hostname,端口号是默认的27000,我们可以看到shutdown_grace_period_s为10s,shutdown_deadline_s为1min。
更多详细的说明可以参考:SHUTDOWN Statement

graceful_shutdown_backends.sh脚本

Impala还提供了另外一种执行graceful shutdown的功能,就是通过执行bin/graceful_shutdown_backends.sh脚本,该脚本在impala编译的image中也有。因此当我们启动container的时候,也可以通过执行该脚本来进行graceful shutdown。该脚本可以接受一个参数,默认是120+10s(在默认的shutdown_grace_period_s基础上增加了10s),该参数只是用来控制输出打印服务退出的信息,实际并不会影响服务本身的退出,该脚本可以关闭当前系统上的所有impalad服务。我们执行脚本之后,相关的输出信息如下所示:

当我们执行./bin/graceful_shutdown_backends.sh 5的时候,日志信息输出5s之后就停止了,此时节点并不一定真的退出了(如果shutdown_grace_period_s大于5s,服务仍然还在)。

执行结果

当我们执行graceful shutdown之后,在相应节点的web页面(服务退出之前)可以看到相应的进度信息,如下所示:

我们分别对coordinator和executor节点进行了graceful shutdown,结果如下所示:
对于coordinator节点,如果执行graceful shutdown:

  • 当前已经执行的SQL不受影响,继续执行;
  • 在coordinator进程未kill之前,新建连接会提示如下错误信息:
Error: Could not open client transport with JDBC Uri: jdbc:hive2://localhost:21050/default;auth=noSasl: Server is being shut down: shutdown grace period left: 2s992ms, deadline left: 8759h59m, queries registered on coordinator: 1, queries executing: 1, fragment instances: 1. (state=08S01,code=0)
  • 在coordinator进程未kill之前,已经新建的连接,提交SQL也会返回如下错误:
Error: Server is being shut down: shutdown grace period left: 6s879ms, deadline left: 8759h59m, queries registered on coordinator: 1, queries executing: 1, fragment instances: 1. (state=HY000,code=0)

对于executor节点, 如果执行graceful shutdown:

  • 当前已经执行的SQL不受影响,继续执行;
  • 后续提交的SQL,不会再往这个节点上产生子计划;

代码实现

说完了graceful shutdown的具体使用,下面来简单看下Impala是如何实现graceful shutdown功能的。总的来说,就是启动一个专门的线程来控制graceful shutdown的进度,并更新相关的集群信息。相关的函数调用如下所示:

从上图可以看到,当我们在client提交:shutdown()的sql时,会被frontend解析为TStmtType::ADMIN_FN,然后传到backend,相关代码如下所示:

# client-request-state.cc
case TStmtType::ADMIN_FN:DCHECK(exec_request_.admin_request.type == TAdminRequestType::SHUTDOWN);RETURN_IF_ERROR(ExecShutdownRequest());break;

当前TAdminRequestType只有SHUTDOWN一个成员。最终会调用StartShutdown函数,然后创建一个名为shutdown的线程。该线程就是执行ShutdownThread方法,启动一个循环,不断更新相关的状态信息,直到跳出循环,退出服务进程。当我们执行graceful shutdown之后,在服务退出之前,可以在/threadz页面搜索到相关的线程,如下所示:

从图中我们可以看到,除了shutdown线程之外,还有一个shutdown-signal-handler线程,下面就来解释下这个线程的含义。通过上面的函数调用图可以看到,在启动impalad进程的时候,会在main函数中通过调用StartImpalaShutdownSignalHandlerThread函数来创建一个名为“shutdown-signal-handler”的线程。该线程会一直使用sigwait()函数等待相应地信号,如果收到IMPALA_SHUTDOWN_SIGNAL(这里就是SIGRTMIN)信号,则调用StartShutdown函数,启动shutdown线程来启动graceful shutdown,相关的代码如下所示:

[[noreturn]] static void ImpalaShutdownSignalHandler() {sigset_t signals;CHECK_EQ(0, sigemptyset(&signals));CHECK_EQ(0, sigaddset(&signals, IMPALA_SHUTDOWN_SIGNAL));DCHECK(ExecEnv::GetInstance() != nullptr);DCHECK(ExecEnv::GetInstance()->impala_server() != nullptr);ImpalaServer* impala_server = ExecEnv::GetInstance()->impala_server();while (true) {int signal;int err = sigwait(&signals, &signal);CHECK(err == 0) << "sigwait(): " << GetStrErrMsg(err) << ": " << err;CHECK_EQ(IMPALA_SHUTDOWN_SIGNAL, signal);ShutdownStatusPB shutdown_status;const int ONE_YEAR_IN_SECONDS = 365 * 24 * 60 * 60;Status status = impala_server->StartShutdown(ONE_YEAR_IN_SECONDS, &shutdown_status);

这里需要注意的是,在调用StartShutdown函数的时候,将deadline函数设置为了1年,因此当我们执行graceful_shutdown_backends.sh脚本的时候,相应的节点会输出如下的信息:

我们查看bin/graceful_shutdown_backends.sh脚本的内容可以发现,主要就是通过向impalad进行发送SIGRTMIN信号来触发graceful shutdown功能:

LOG "Initiating graceful shutdown."
for pid in $(pgrep impalad); doLOG "Sending signal to daemon with pid $pid"kill -SIGRTMIN $pid
done

到这里关于graceful shutdown的功能和实现我们就基本介绍完毕了,当然这其中还有关于集群信息如何更新,状态同步等内容就不再这篇文章中阐述,后续有机会的话,再跟大家一起学习。graceful shutdown涉及到的相关JIRA如下:

  • IMPALA-1760
  • IMPALA-8401
  • IMPALA-8789

Impala graceful shutdown功能介绍相关推荐

  1. setsockopt()函数功能介绍

    setsockopt()函数功能介绍 功能描述:获取或者设置与某个套接字关联的选项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层. 用法: #include <sys/types.h ...

  2. jmeter功能介绍(三)

    连载jmeter功能介绍二 csv data set config dummy 用于调试使用,可以自定义返回内容. Console Status Logger 将执行信息过程,命令行打印出来 命令行执 ...

  3. linux大多数进程都是sleep,Linux电源管理(5)_Hibernate和Sleep功能介绍

    Linux电源管理(5)_Hibernate和Sleep功能介绍 作者:wowo 发布于:2014-6-10 16:11 分类:电源管理子系统 1. 前言 Hibernate和Sleep两个功能是Li ...

  4. setsocketopt()函数功能介绍

    本文转自与启云的setsocketopt()函数功能介绍 setsocketopt()函数功能介绍 功能描述:获取或者设置与某个套接字关联的选项.选项可能存在于多层协议中,它们总会出现在最上面的套接字 ...

  5. Calico BGP功能介绍:BIRD简介

    Calico 作为一种常用的 Kubernetes 网络插件,使用 BGP 协议对各节点的容器网络进行路由交换.本文是<Calico BGP 功能介绍>系列的第一篇,介绍 Calico 所 ...

  6. HiCar基本功能介绍

    HiCar基本功能介绍 基本概述 一方面,基于操作系统超强的分布式能力,HUAWEI HiCar通过手机和汽车之间的连接,基于三层标准与能力,构建手机和汽车互助资源池,把手机的服务生态延伸到车内,实现 ...

  7. vs2008\drivers\opengl_2.h.c_opengl基本功能介绍+示例

    /**** openGL上的画点函数 即基本功能介绍 *****/ /***************************************************************** ...

  8. 大白菜软件常用功能介绍

    大白菜软件常用功能介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.刻录光盘介绍 1.选择你需要的刻录的光盘 2.点击刻录光盘 3.确认之后点击刻录 4.等待刻录完成 转载于 ...

  9. Redis Manager 主要功能介绍

    GitHub: github.com/ngbdf/redis- Redis Manager 是 Redis 一站式管理平台,支持集群的创建.管理.监控和报警. 集群创建:包含了三种方式 Docker. ...

  10. 键盘上的F1,F2,……,F12的各功能介绍

    键盘上的F1,F2,--,F12的各功能介绍 一般情况下,键盘上有12个功能键,统称为Fn键. F1:如果我们在一个选定的程序或页面中并且需要帮助,那么请按下F1.如果现在不是处在任何程序中,而是处在 ...

最新文章

  1. 用NVIDIA NsightcComputeRoofline分析加速高性能HPC的应用
  2. LeetCode 7. Reverse Integer
  3. MATLAB知识点总结
  4. 抖音出现大量“三岁用户”,马化腾李彦宏都被还童
  5. Python解释器种类以及特点?
  6. 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!
  7. SQL Server 2008 安装过程中遇到“性能计数器注册表”..
  8. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Jsp页面
  9. Linux/CentOS下安装Apache/SVN/Subversion图文详解教程
  10. 【机器学习】feature_importances_ 参数源码解析
  11. (dag模型+最长路+字典序)嵌套矩形
  12. 北方华创:「8大报表应用场景」助力全方位数字化管理
  13. html5+上下左右边界顺序,详解canvas绘制多张图的排列顺序问题
  14. Ubuntu16.04 下convert 命令 将eps转tif,jpg,png,pdf格式
  15. 数据传输服务 DTS > 数据迁移 > 同一阿里云账号实例间迁移 > RDS实例间的数据迁移
  16. 《流畅的python》之 设计模式, 装饰器
  17. itextpdf 超链接
  18. Python中切片(Slicing)的运用(:运算符)
  19. 计算机桌面分页,你的电脑桌面还会一团糟吗?这款软件可以帮你整理文件
  20. [ Vue.js ] 报错 ‘scope‘ is defined but never used vue/no-unused-vars

热门文章

  1. mysql触发器安全吗_猎八哥浅谈MYSQL触发器
  2. SpringBoot初学笔记(SpringBoot实战之数据库相关操作)
  3. 关于PEND SV的引入思考
  4. iOS APP上线App Store流程(包括.p12导出)
  5. ubuntu16.04安装Preempt RT实时内核
  6. python随机生成4位验证码并判断是否正确_python生成4位验证码
  7. [unix] Unix 是简单的,你不需要成为一个天才或是计算机专家也能理解它!
  8. vue使用file-saver本地文件导出
  9. UWB电厂人员定位系统优势有哪些?
  10. php获取真实图片后缀