azkaban短信报警功能和项目依赖功能实现

tech2023-05-17  104

azkaban短信报警功能和项目依赖功能实现

 


前言

目前,调度工具中,使用最多的就是oozie和azkaban,但是,这两个工具都没有项目依赖功能和短信报警功能,我们公司一直在使用azkaban,但是原生的azkaban只有邮件报警功能,收到邮件报警对于我们来说,并不能很快速的响应到相关开发人员。并且我们项目之间需要有依赖,例如:A项目是一个定时抽取数据的任务,B任务是计算任务,但是B任务必须在A任务完成过后才能做计算。这就是一个简单的项目依赖场景。针对以上场景,我花了两周时间,实现了对azkaban的二次开发。由于在开发过程中,没有做详细记录,本文只描述了开发的大体思路和主要修改的地方,具体修改内容请看代码。

 

一、azkaban短信报警功能的实现

实现短信报警功能,首先我们需要对接公司的短信报警平台,短信报警平台的代码公司已经准备好了,我只需要做一些相关配置,并且调用相关API就行了。这里就引申出两个问题:1.配置加入到azkaban.properties过后,azkaban是怎么读取出来并应用上去的。2.我们怎么解析出手机号码。接下来,我带着这两个目的进行开发。

1.读取azkaban.properties配置文件

在azkaban.webapp.AzkabanWebServer中,配置文件被加入进来,我们可以看到,配置文件信息被封装到了azkaban.utils.Props类中,后续我们只需要取到这个类,就能读取到配置文件中的配置信息,为了完成开发,我们只需要关心怎么取到这个类就行了,是不是够简单粗暴了。

2.web界面实现手机报警功能

手机报警功能的实现有两种方式:一种是在web页面上添加手机号,另一种方式是在flow文件中添加手机号。首先,我先介绍下怎么在web页面上添加手机号:web添加的思路是仿照邮件添加的方式进行添加,如下图:

我们先找到这个页面的代码,resources/azkaban/webapp/servlet/velocity/flowexecutionpanel.vm,这个只需要仿照email的方式,添加好这里的代码就可以了,代码详见文章末尾。

然后,后台怎么收到这里的内容呢?我们找到HttpRequestUtils类,这里面的parseFlowOptions是处理收到的HTTP请求的方法,这个时候,我们能拿到刚才前端传过来的手机号信息了,但是怎么封装呢,通过对这个方法的分析,大家可以发现,email的数据是封装到ExecutionOptions中,我们也仿照email的添加方式,对ExecutionOptions和HttpRequestUtils进行修改。

下一步,我们需要增加短信报警器和报警内容。azkaban提供了一个报警接口Alerter,我们需要实现这个接口在各个方法中调用短信平台发送短信就可以了,但是光这样还是不行,我们需要把自己的报警器注入到azkaban当中,这样触发报警的时候会调用我们的报警器。

注入报警器的位置在AlerterHolder,我们只需要在loadAlerters方法中,把报警器注入进去就可以了,需要注意的是,我这里把上文说的配置文件也注入了进来,大家可以发现的是,这里是能拿到加载的配置文件信息的,所以这个时机把配置文件一起注入进来是比较合适的。

最后一步:虽然我们已经把报警器注入到系统当中了,但是系统怎么调度呢,所以,这里还差一步,需要在触发相应报警的时候,调用我们短信的调度系统。在ExecutionControllerUtils类中,仿照email的方式,添加短信报警的调度。

做了以上步骤后,就能实现页面添加手机号进行短信报警了。

3.flow配置文件实现手机报警功能

虽然web实现了手机好的配置,但是我们还是喜欢直接在flow配置文件当中配置手机号,如图:

如果需要用这种方式来配置,需要考虑的是,1.flow在运行的时候,怎么拿到配置信息。2.配置信息怎么封装传递到报警器当中的。这里的修改记得不是很清楚,我大致描述一下,flow中的信息都是封装到Flow类当中,我们需要仿照email添加好手机的成员变量和相关方法。然后FlowLoaderUtils中仿照addEmailPropsToFlow方法,添加一个addSmsPropsToFlow方法,这个方法是吧flow中的手机号信息,添加到prop类当中,我们只需要仿照addEmailPropsToFlow被调用的方式,在addEmailPropsToFlow被调用的时候添加上调用addSmsPropsToFlow方法就可以了。

二、azkaban的项目依赖

做了这么多年的开发,我使用了很多语言,包括shell、Java、python、Scala、go。我始终觉得做开发最重要的不是写程序,不是语言。而是思路,是解决方案。所以,这里我提供给大家一个解决方案,也是我写好程序了过后,已经上线的方案。

azkaban提供了很多api,这些api涵盖非常全面,足以满足我们的各类需求。所以经过我这两周对azkaban的开发,想要满足项目依赖的需求,我的第一反应就是直接调API。我用python实现了这个需求:思路如下,我们在执行项目B的时候,需要A、C项目要先执行完毕,所以我在B项目中加入了一个job,这个job是监听A/C项目的状态,如果A/C项目没有执行完毕,那么等待,如果执行失败,那么这个job抛出异常,也执行失败。直到项目AC执行完毕过后,才能执行后面的job。同时根据需求,还加入了每次等待的最长时间,每次监听的步长,这个项目是否是必须监控项等,这里根据各个公司的要求,可以做一些其他调整,最最主要的是这个思路。监听脚本我会在末尾发出来,需要注意的是,为了方便控制,这里对于修改了一出源码,就是获取session的时候,我这里增加了一个方式,如果发送登陆请求带了sessionID,那么就分配这个sessionID给用户,增加这个功能的目的是方便管控sessionID。修改的地方在LoginAbstractAzkabanServlet.java类中。


总结

代码:https://github.com/chenyueqiang/azkaban-projectdepends.git  项目依赖脚本:azkaban.py

最新回复(0)