对海量数据进行处理时,目前大部分公司都采用Hadoop来对数据进行离线处理,但是由于业务场景,经常一个MR或者Hive或者其他形式的任务无法直接完成业务需要,需要任务之间按照特定关系来执行(任务流),例如任务1执行完成之后,才能执行任务2、任务2执行完成之后才能执行任务3和4,在这种情况下需要一套调度系统把各个任务之间的依赖关系串联起来,
目前来说,有很多开源的系统,最著名的应该算是Apache的Oozie,这里主要给大家介绍一下阿里开源的一个优秀的调度系统Zeus,GitHub地址:http://github.com/alibaba/zeus,该调度系统是想比较Oozie主要存在如下优点:
1、友好的界面显示、全中文,配置简单,Oozie的配置依赖XML文件,但是Zeus可以直接在界面配置
2、开发中心、调度中心功能完备,不仅可以在上面正式调度任务、还可以在上面进行任务开发
3、支持MR、Hive、Shell等多种任务
4、Zeus支持单机和分布式、在分布式场景下,整个集群自动切换主备,无需人工干预
5、任务失败晚上的告警方案
但是该调度系统只支持Hadoop1,且存在一些BUG,不过好消息是本人意见将其进行了二次开发,且支持Hadoop2,并且对其功能进行了增强,更好的消息是,本人已经将其开源贡献出来,GitHub地址如下:https://github.com/michael8335/zeus2
先给一个zeus的架构图
不管Master还是Worker都有一套WEB UI,不管从哪个上面去看,看到的结果都是一样的,实际上一般只看主
Master:调度内核,在启动时启动一个TCP服务,同时将所有任务读到内存中,在任务可以执行时,加到执行队列,下发到客户端
Worker:启动后连接Master,并定时向Master发送心跳,当收到Master的任务后,封装任务执行shell,并将任务执行结果通知给Master
Master单点:在zeus中,整个机器的每个节点都有可能成为Master,整个集群是通过一把分布式锁来唯一确定Master,Master在获得分布式锁后,会定时更新分布式锁状态,所有的Worker都会检查分布式锁状态,如果发现Master未按时更新锁状态,则各个Worker竞争获得该锁,获得锁后,使自己成为Master。
未能获得锁的Worker会将自己正在执行的任务杀死,然后重新连接新的Master,Master会将之前正在执行的Job重新下发给Worker