唯品会分布式任务调度平台Saturn使用手册

本文将使用SSM框架来创建Saturn 定时任务。

1. 确定saturn console能否访问 ip+:9088 例如:192.168.1.xxx:9088

2. 在pom.xml添加dependency

<dependency> 
    <groupId>com.vip.saturn</groupId> 
    <artifactId>saturn-job-api</artifactId> 
    <!-- 修改成指定版本 --> 
    <version>3.0.1</version> 
</dependency>

以及plugin

<plugin> 
    <groupId>com.vip.saturn</groupId> 
    <artifactId>saturn-plugin</artifactId> 
    <!-- 版本与saturn-job-api一致 --> 
    <version>3.0.1</version> 
</plugin>

注意:3.0.1版本不是Saturn最新版本,可根据自己需求选择不同的版本。

3. 在创建Job类之前要创建工厂来加载类。

  MySpringApplicationContext.java

public class MySpringApplicationContext extends AbstractXmlApplicationContext {

	private Resource[] configResources;

	public MySpringApplicationContext(Resource[] configResources) throws BeansException {
		this(configResources, true, null, null);
	}

	public MySpringApplicationContext(Resource[] configResources, ClassLoader classLoader) throws BeansException {
		this(configResources, true, null, classLoader);
	}

	public MySpringApplicationContext(Resource[] configResources, boolean refresh, ApplicationContext parent,
			ClassLoader classLoader) throws BeansException {
		super(parent);
		if (classLoader != null) {
			this.setClassLoader(classLoader);
		}
		this.configResources = configResources;
		if (refresh) {
			refresh();
		}
		// 注册关闭钩子
		registerShutdownHook();
	}

	protected Resource[] getConfigResources() {
		return this.configResources;
	}

}

  SpringFactory.java

  通过MySpringApplicationContext加载需要的xml配置文件,可根据自己需求来加载需要的xml配置文件。

public class SpringFactory {

    private static final String APPLICATION_CONTEXT_ROOT = "spring/applicationContext-root.xml";
    
    private static final String APPLICATION_CONTEXT_MQ = "spring/applicationContext-mq.xml";
    
    private static final String APPLICATION_CONTEXT_PERSISTENCE = "spring/applicationContext-persistence.xml";
    
    private static SpringFactory instance = new SpringFactory();

    public static SpringFactory getInstance() {
        return instance;
    }

    private BeanFactory factory;

    public Object getObject(String beanId) {
        return factory.getBean(beanId);
    }

    private SpringFactory() {
        List<Resource> resources = new ArrayList<Resource>();

        resources.add(new ClassPathResource(APPLICATION_CONTEXT_ROOT));
        resources.add(new ClassPathResource(APPLICATION_CONTEXT_MQ));
        resources.add(new ClassPathResource(APPLICATION_CONTEXT_PERSISTENCE));

        Resource[] resourceArrays = new Resource[resources.size()];
        try {
            ApplicationContext context = new MySpringApplicationContext(resources.toArray(resourceArrays));
            factory = (BeanFactory) context;
        } catch (RuntimeException e) {
            e.printStackTrace();
            throw e;
        }

    }

}

4. 修改现在类或者增加一个新的类,继承自AbstractSaturnJavaJob ,实现 handleJavaJob方法。

@Component
public class SaturnTest extends AbstractSaturnJavaJob {
    
    @Override
    public SaturnJobReturn handleJavaJob(String jobName, Integer shardItem, String shardParam,SaturnJobExecutionContext shardingContext) {
        SaturnTest instance = (SaturnTest ) SpringFactory.getInstance().getObject("saturnTest");
        saturnJobReturn = new SaturnJobReturn("分片:" + shardParam);
        instance.svResult(instance);
        return saturnJobReturn;

    }
}

  如果捕获Exception后要任务显示失败要设置ErrorGroup=500,同时可以在returnMsg设置一些返回信息

catch (Exception e) {
            saturnJobReturn.setErrorGroup(500);
            saturnJobReturn.setReturnMsg("*********数据异常" + e.getMessage());
            logger.error("**********取得数据异常", Throwables.getStackTraceAsString(e));
        }

 如下为Saturn提供的状态码。

public final class SaturnSystemErrorGroup {

	public static final int SUCCESS = 200;

	// general fail
	public static final int FAIL = 500;

	public static final int TIMEOUT = 550;

	// alarm will be raised with this error code
	public static final int FAIL_NEED_RAISE_ALARM = 551;

	public static Set<Integer> getAllSystemErrorGroups(){
		Set<Integer> resultSet = new HashSet<>();
		resultSet.add(SUCCESS);
		resultSet.add(FAIL);
		resultSet.add(TIMEOUT);
		resultSet.add(FAIL_NEED_RAISE_ALARM);

		return resultSet;
	}

}

5.eclipse调试作业

  • com.vip.saturn:saturn-plugin:3.0.1:run -Dnamespace=部署console的URI -DexecutorName=执行器的名称(随意起名) -DVIP_SATURN_CONSOLE_URI=http://192.168.xx.xx.:9088

-Dspring.profiles.active=dev

 

注:namespace要修改为使用的域名,URI要修改为正确的地址,executorName为执行节点名称

6.saturn console添加java作业

  • 作业类型: 分为Java定时作业和Shell定时作业,这里选择Java定时作业
  • 作业名:作业ID标识,namespace下必须唯一
  • 作业实现类:作业实现类的完整包名+类名
  • cron表达式:作业定时表达式
  • 作业分片总数:表示并发执行的数量,2代表该作业同时有两个进程在并发执行,每个进程都有自己专门的脚本和参数(这些进程可能同跑在不同机器上的)。

注:优先Executor:如果你想选择特定的物理机executor去运行你的作业,则需要设置优先executor。下拉框的候选项为当前域下的所有在线的executor。只使用优先Executor:如果优先executor离线了,不会failover到其他机器,在本机测试作业的时候要勾选只使用优先executor。 

注:分片数可根据需求来定

  • 分片序列号/参数对照表:定义每个分片执行的完整脚本路径及参数。这是saturn最重要的参数之一。

注:由于分片个数为1,所以分片参数只需要一个键值对(0=local01)key值为0,value:实际填写时要使用executorName作为value值,。

  • 作业描述信息 :作业描述
  • 更多高级的配置,可以在作业编辑页面进行编辑(根据自身需要来定)

在eclipse控制台会看到日志

7.如果上述步骤没有问题,则意味着作业在本地验证通过。现在可以进行部署了。

saturn:zip

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
大数据"分布式调度框架"大集合 大数据"分布式调度框架"大集合全文共22页,当前为第1页。大数据"分布式调度框架"大集合全文共22页,当前为第1页。大数据"分布式调度框架"大集合 大数据"分布式调度框架"大集合全文共22页,当前为第1页。 大数据"分布式调度框架"大集合全文共22页,当前为第1页。 1、什么是分布式任务调度任务调度是指基于给定的时间点,给定的时间间隔或者给定执行次数自动的执行任务。任务调度是是操作系统的重要组成部分,而对于实时的操作系统,任务调度直接影响着操作系统的实时性能。任务调度涉及到多线程并发、运行时间规则定制及解析、线程池的维护等诸多方面的工作。 WEB服务器在接受请求时,会创建一个新的线程服务。但是资源有限,必须对资源进行控制,首先就是限制服务线程的最大数目,其次考虑以线程池共享服务的线程资源,降低频繁创建、销毁线程的消耗;然后任务调度信息的存储包括运行次数、调度规则以及运行数据等。一个合适的任务调度框架对于项目的整体性能来说显得尤为重要。 2、常见的任务调度框架有哪些? 我们在实际的开发工作中,或多或少的都会用到任务调度这个功能。常见的分布式任务调度框架有:cronsun、Elastic-job、saturn、lts、TBSchedule、xxl-job等。 2.1cronsun crontab是Linux系统里面最简单易用的定时任务管理工具,在Linux上由crond来周期性的执行指令列表,执行的任务称为cron job,多个任务就称为crontab。crontab任务调度指令的基本格式为: * * * * * command 分 时 日 月 周 命令 但是时间久了之后会发现,crontab会存在一些问题: 大量的crontab分散在各台服务器,带来了很高的维护成本; 任务没有按时执行,过了很长的时间才能发现,需要重试或者排查; crontab分散在很多集群上,需要一台一台的去查看日志; crontab存在单点问题,对于不能重复执行的定时任务很伤脑; …… 大数据"分布式调度框架"大集合全文共22页,当前为第2页。大数据"分布式调度框架"大集合全文共22页,当前为第2页。因此非常需要一个集中管理定时任务的系统,于是就有了cronsun。cronsun是一个分布式任务系统,单个节点和Linux机器上的contab近似,是为了解决多台Linux机器上crontab任务管理不方便的问题,同时提供了任务高可用的支持(当某个节点死机的时候可以自动调整到正常的节点执行)。与此同时,它还支持界面管理机器上的任务,支持任务失败邮件提醒,安装简单,使用简便,是替换crontab的一个不错的选择。 大数据"分布式调度框架"大集合全文共22页,当前为第2页。 大数据"分布式调度框架"大集合全文共22页,当前为第2页。 cronsun中主要有三个组件,都是通过etcd通讯的。cronnode负责节点的分组及节点的状态,cronweb是用来管理任务的、任务的执行结果都可以在上面看。 cronsun的系统架构如下图所示,简单的来说就是,所有的任务都会存储在一个分布式etcd里,单个crond部署成一个服务,也就是图中所示的node.1、node.2、node.n等,然后再由web界面去管理。如果任务执行失败的话,会发送失败的邮件,当单个节点死机的时候,也会自动调整到正常的节点去执行任务。 cronsun是在管理后台添加任务的,所以一旦管理后台泄漏出去了,则存在一定的危险性,所 cronsun支持security.json的安全设置: {'open': true,'#users': '允许选择运行脚本的用户', 'users': ['www', 'db' ],'#ext': '允许添加以下扩展名结束的脚本', 'ext': ['.cron.sh', '.cron.py' ]} 大数据"分布式调度框架"大集合全文共22页,当前为第3页。大数据"分布式调度框架"大集合全文共22页,当前为第3页。如以上设置开启安全限制,则添加和执行任务的时候只允许选择配置里面指定的用户来执行脚本,并且脚本的扩展名要在配置的脚本的扩展名限制的列表里面。 大数据"分布式调度框架"大集合全文共22页,当前为第3页。 大数据"分布式调度框架"大集合全文共22页,当前为第3页。 2.2、Elastic-job Elastic-job是当当开源的一款非常好用的作业框架,Elastic-job在2.x之后,出现了两个相互独立的产品线:Elastic-job-lite和Elastic-job-cloud。 2.2.1、Elastic-job-lite Elastic-job-lite定位为轻量级无中心化的解决方案,使用jar包的形式提供分布式任务的协调服务,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值