IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 一次azkaban-exec某个节点不执行任务的问题总结复盘 -> 正文阅读

[大数据]一次azkaban-exec某个节点不执行任务的问题总结复盘

1、问题描述

先说下我们生产环境的部署情况
azkaban-exec部署在prod11、prod12两台机器上,这两台都是物理机,同时还不部署了namenode、resourcemanafer、historyserver、hiverserver、metastore等

正常情况应该是两个azkaban-exec节点都能执行任务,但是昨天发现居然只有一个节点在执行任务

可以通过执行sql语句进行验证:

select * from executors;
 
+----+------------------------+-------+--------+
| id | host                   | port  | active |
+----+------------------------+-------+--------+
| 36 | hdfs-prod12.yingzi.com | 12321 |      1 |
| 35 | hdfs-prod11.yingzi.com | 12321 |      1 |
+----+------------------------+-------+--------+
 
#查看2022-02-22 00:00:00以后任务执行情况
select executor_id,count(1),FROM_UNIXTIME(max(update_time)/1000) from execution_flows where executor_id in (35,36) and update_time>=1645459200000 group by executor_id;
+-------------+----------+--------------------------------------+
| executor_id | count(1) | FROM_UNIXTIME(max(update_time)/1000) |
+-------------+----------+--------------------------------------+
|          35 |       41 | 2022-02-22 23:28:19.0980             |
|          36 |    16168 | 2022-02-23 17:38:34.3840             |
+-------------+----------+--------------------------------------+

可以看出prod11最近执行任务的时间是2022-02-22 23:28:19,并且22号一天也只执行了41次

再把时间往前推,发现prod11之前也是有问题的,只偶尔执行极少的任务。

虽然业务没有受到影响,但是全部离线任务都只能在prod12上执行,会导致prod12压力过大

而且会存在单点问题,万一prod12出问题,那离线任务就没法执行,影响业务了

2、发现-解决问题过程

这个问题其实早前就已经有端倪了,从年前开始,生产环境就会断断续续收到prod12的hiverserver2服务监控告警。
不过告警内容只是检测hiveserver2偶尔响应超时,查看应用JVM监控,并没有发现应用有什么异样。
hiverserver2本身是有部署多个节点的,并没有对任务执行产生影响。
而且这个告警很久才发生一次,所以并没有引起我们足够的重视。

2022-02-23凌晨,发生了多次hiverserver2的超时报警,都在prod12这台机
感觉事情没这么简单,于是开始重视起来
比较奇怪的是,hiveserver2也是部署在prod11和prod12节点,为啥都是只有prod12报,prod11从来不报的
对比两台机器的node监控,发现一些问题

prod11 CPU使用率:
在这里插入图片描述
prod12 CPU使用率:
在这里插入图片描述
prod11线程数监控:
在这里插入图片描述
prod12线程数监控:
在这里插入图片描述
prod11每秒fork进程数:
在这里插入图片描述
prod12每秒fork进程数:
在这里插入图片描述

可以看到:

  • CPU使用率prod11只有5左右,prod12峰值则高达60-70
  • prod12线程数差不多有prod11的两倍
  • 还有每秒种fork的进程数,差别更大:prod11只有30不到,prod12最大都超过200了

这两台部署的服务是相近的,为何会差距这么大呢?
每秒fork的进程数,第一时间想到的就是azkaban
因为azkaban-exec执行任务都是通过调用shell命令的方式,每次shell调用都是fork新的进程

于是对azkaban进行检查,程序本身状态是很健康的。
但是通过sql查询任务执行情况,发现prod11基本不执行任务的
此时基本可以确定是因为任务全部在prod12执行,导致这台机压力过大,进而影响了hiveserver2的响应

至于prod11为什么不执行任务(偶尔执行),则没有太好的思路
只看监控,应用本身是很健康的
于是只能去看azkaban代码,分析可能是哪一环节存在问题,再进行排查

排查了半天,并没有很大进展
尝试重启azkaban服务
没有意外,果然重启并不能解决问题。

还是只能继续啃代码,结合开发环境做实验来进行理解。
终于定位到问题点在哪里。

azkaban默认任务执行采用的推模式,由azkaban-web选择合适的executor,通过调用azkaban-exec http接口的方式,把任务"推"给executor执行
关键的核心就在于选择executor的代码,比较重要的是几个azkaban.executorselector.comparator前缀的配置。
查看生产环境azkaban-web的配置如下:

azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
azkaban.executorselector.comparator.Memory=6
azkaban.executorselector.comparator.LastDispatched=1
azkaban.executorselector.comparator.CpuUsage=3

这里几个配置分别指:正在执行的任务数、系统可用内存、最近执行任务时间、CPU使用率等几个指标,配置的数字表示指标权重
大致策略是,把各个executor的指标进行对比,并根据权重求和,最终再进行对比,选择分数最高的那个

这几个指标的默认权重都是1,但是不知道是谁把权重调整成6了,已无从考究。
比较要命的是,prod11的内存占用,大部分时间都高于prod12(虽然实际内存都很充足)
因为内存的权重太高,导致内存基本成了选择executor的决定性因素,所以大部分任务都分发到prod12执行,和事实相符

因为azkaban是直接部署在物理机,混合部署了多个应用,所以单纯的根据内存和CPU来确定executor的优先级,其实是不靠谱的
所以我们决定把Memory和CpuUsage这两个指标去掉
直接注释掉相应的配置然后重启azkaban-web,问题得到解决

执行sql查看重启以后每个小时的任务执行情况:

select t.time_hour,sum(case executor_id when 38 then num else 0 end) num_prod11,sum(case executor_id when 36 then num else 0 end) num_prod12  from
    (
    select executor_id,FROM_UNIXTIME(update_time/1000,'%Y-%m-%d %H') time_hour,count(1) num from execution_flows where executor_id in (38,36) and update_time>=1645675200000 group by executor_id,FROM_UNIXTIME(update_time/1000,'%Y-%m-%d %H')
    )t group by t.time_hour;
 
 
+---------------+------------+------------+
| time_hour     | num_prod11 | num_prod12 |
+---------------+------------+------------+
| 2022-02-24 12 |        164 |        147 |
| 2022-02-24 13 |        178 |        134 |
| 2022-02-24 14 |        159 |        151 |
| 2022-02-24 15 |        153 |        163 |
| 2022-02-24 16 |        159 |        134 |
+---------------+------------+------------+

可以看到,两个节点都会执行任务了,基本比较平均
偶尔有些差异,推测是任务之间差异,有些大任务执行比较耗时,执行这些大任务的节点,执行的任务数相应也会降低。

3、总结&改进

1、一切的异常现象都是有原因的,后续遇到监控报警一定要重视,探寻背后的真相

2、目前我们大数据的部署模式,基本都是多个应用服务混合部署在一台物理机的,会存在不同进程之间资源竞争,互相影响
尤其像azkaban这种,会有大量短小的子进程,很难进行问题排查
后续增加服务器进程监控,便于观察
同时也要增加对进程的资源管控

3、azkaban需增加任务执行情况的监控,防止后面又出现任务分发不均衡的问题

4、azkaban除了推模式还有拉模式,相对于推,拉模式可能更有优势,后续进行研究

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:37:32  更:2022-02-26 11:41:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:43:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码