任务分片是通过分而治之的思想将单一任务按特定逻辑切分为多个独立子任务,将多个独立子任务路由到部署组不同的节点执行,提高任务执行效率,同时提升整体资源利用效率。
应用场景
- 大数据批处理场景:针对大数据批处理场景如海量离线日志信息统计,需要在特定的时间完成大规模数据处理,则需将分散在不同资源实例的日志文件按行进行切分,针对分割后的文件采用多线程并行处理,最后将单实例、多实例的日志统计信息进行汇总,极大提升数据的并发处理效率。
- 金融行业结息处理:结息类任务是金融行业典型的批处理任务,每日定期执行且要在当天完成,需要结息的账户数量巨大且任务开始后数据不会增加。通过任务分片能力将基于数据拆分的索引块在多个节点并发执行,有效提升任务执行效率。
功能特性
- 支持静态分片模型。
- 高可用:分片任务基于一致性hash的任务分发策略,当某个执行实例发生异常时,服务端会把分片任务分发到可用的实例执行。
- 流量控制:分片任务通过子任务单机并发数限制,有效进行执行实例的流量控制,避免执行任务相互影响导致性能下降。如有100个分片,一共10个执行实例,设置子任务单机并发数限制为5,则每个执行实例最多同时并发执行5个分片任务,其他任务在消息队列中等待处理。
- 分片自动失败重试:通过设置任务的重试策略即重试次数、重试间隔,分片任务失败后按照重试策略自动重试。
注意:
优先在当前执行实例进行重试,如果当前执行实例不可用则在剩余的执行实例中选择可用的工作节点执行分片任务。
- 断点续跑:支持针对已经完成的分片任务批次提供断点续跑能力,断点续跑只执行当前批次状态为失败的分片实例,并将该分片实例上次执行失败后传递的扩展参数进行下发,通过任务执行上下文获取下发的扩展参数可以继续未完成的业务逻辑。
操作步骤
创建任务
- 登录 TSF 控制台。
- 在左侧菜单栏中,找到【组件中心】分类,单击【分布式任务调度】>【任务管理】,进入任务管理页面。
- 在任务管理页面,单击【新建任务】,在新建任务的弹框选择 执行方式 为 分片执行 。
- 分片数量:任务拆分的分片总数。取值范围为 [1,1000],默认值为2。
- 超时设定:判定分片子任务执行超时的执行时长;执行时间超出此预设值且任务还没有执行完成时,将此次执行判断为“超时”
- 重试次数:不为0时,会在正常分片实例执行失败后自动重试所设置的次数
- 重试间隔:“重试次数”不为0时必填,上次分片实例执行失败后,间隔所设置的时长进行重试
- 子任务单机并发数限制:单个执行实例最大并发执行的分片任务数,通过子任务单机并发数限制能有效进行流量控制,避免执行任务相互影响导致性能下降。
- 分片参数:分片任务下发执行的分片参数,以键值对方式呈现。如“ key1=value2,key2=value2,key3=value3 ”,键值对以 “, ”英文逗号进行分割;分片索引为整数,取值范围为 [1,1000];分片参数value支持英文大小写、数字、下划线与连接符、中文,分片参数总体不超过10000个字符。分片参数分必信息,如果您未配置分片参数则通过任务执行上下文获取分片索引执行对应的业务逻辑。
- 设置完成后,单击【保存】,所创建的任务将显示在任务列表中。
说明:
- 每个用户最多可创建50个任务。
- 执行任务的实例,需正确 配置 SDK 后,才可执行任务。
执行任务
- 在【任务管理】中,找到任务列表中的目标任务。
- 单击操作列中的【更多】>【运行一次】,手动触发所选任务的一次执行。
任务将无视所设置的触发方式和时间执行一次,您可在【执行记录】或【任务详情】中查看此次执行的情况。
查看任务执行记录
- 在【任务管理】中,找到任务列表中的目标任务。
- 单击任务 ID,进入任务的详情页,查看任务的配置信息和执行情况。
- 任务执行记录分为 【基本任务】与【工作流任务】标签选项,如果任务未导入工作流则在【基本任务】展示任务的历史执行记录,如果已经导入某个工作流,则在【工作流任务】展示任务的最新执行记录。
- 任务执行记录中操作的【更多】> 【停止执行】,系统强行终止此次执行中所有实例的任务执行;【更多】> 【重新执行】,系统会针对该批次重新执行并产生新的批次流水展示该批次的历史执行记录,执行节点信息与执行任务内容与当前所选批次一致;【更多】> 【断点续跑】,只执行当前批次状态为失败的分片实例,并将该分片实例上次执行失败后传递的扩展参数进行下发。
查看任务执行详情详情
- 在任务的【执行记录】中,找到选定的批次列表。
- 单击批次ID或详情,进入批次的执行详情页,查看该批次所有分片的执行情况。
- 分片任务的执行详情展示分片任务当前批次的所有子任务执行情况,可以按分片索引信息、执行ID、执行实例进行模糊匹配搜索。
- 通过【执行日志】可以查看执行实例的最新执行日志信息并支持模糊搜索;点击【更多】可以对正在执行中的节点执行【停止执行】,对已经完成的分片实例执行【重新执行】并产生新的执行流水记录历史执行版本,点击【分片参数】可以查看该分片对应的分片参数信息。
分片任务开发示例
- 参照 参照 SDK 使用指南 引入任务调度SDK Maven 依赖。
- 在应用代码中继承
ExecutableTask
, 通过ExecutableTaskData.getShardingArgs()
, 可以获取到任务的分片参数。通过ShardingArgs.getShardKey()
可以获取到分片 Key,通过ShardingArgs.getShardValue()
可以获取到分片 Value。通过ExecutableTaskData.getTaskMeta()
可以获取到任务的元信息,包括任务 ID、批次 ID 等。
public class SimpleShardExecutableTask implements ExecutableTask {
private final static Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@Override
public ProcessResult execute(ExecutableTaskData executableTaskData) {
ShardingArgs shardingArgs = executableTaskData.getShardingArgs();
TaskExecuteMeta executeMeta = executableTaskData.getTaskMeta();
System.out.println("executeMeta: " + executeMeta);
// 输出分片参数
System.out.println("shardingArgs: " + shardingArgs);
// 输出分片参数 KEY-VALUE
System.out.println("shardingKey: " + shardingArgs.getShardKey() + ", shardingValue: " + shardingArgs.getShardValue());
// 执行3秒
ThreadUtils.waitMs(3000L);
return ProcessResult.newSuccessResult();
}
}