郑昀 创建于2015/11/10 最后更新于2015/11/12
关键词:佣金计算、定时任务、数据抽取、数据清洗、数据计算、Java、Redis、MySQL、Zookeeper、azkaban2、oozie、mesos
提纲:
  1. 为什么要做“数据”并行计算调度?
  2. 他山之玉:azkaban2/oozie/mesos
  3. Summoner的特性

Summoner 是国玺部门推出的基于 MySQL+Redis+Zookeeper 的分布式并行计算调度和管理系统,李红红主设。
 

0x00,为什么要做“数据”并行计算调度?

大家都可能做过基于 MySQL 数据库的,大规模的、有步骤的、步骤与步骤之间有依赖关系的数据计算。你可能定义了一堆彼此依赖的定时任务,也可能写成一个大进程跑。
举一个实际场景吧,在我们 O2O 业务体系下,我要做人员规模三四千人、有多条业务线、组织结构为大区-区域-城市-销售组的销售团队的昨日佣金和当月佣金,这里的挑战是:
  • 涉及到商户、门店、交易、折扣、核销物料等等,数据量很大,至少每天都要算一次,要算得快,
  • 激励政策和佣金计算公式随着竞争态势变化,一般一两个月变一次,
  • 数据抽取尽可能少影响正常业务,
  • 计算逻辑调整后要能快速部署和运行。
那么,以前可能会定义一些定时任务,每天凌晨从各个业务数据库(毕竟全都拆库分表了)里抽取:
  1. 人员组织架构
  2. 大区、区域和城市的对照关系
  3. 合同以及合同拥有者
  4. 商户和门店
  5. 门店下的收单交易
  6. 佣金计算公式、规则以及各种权重因子
  7. ……
既有全量数据,也有增量数据,所以数据量是很大的。
先算签约数、开店数、交易量等,再把业绩归结在 BD 身上,根据不同业务线的佣金计算公式依次对 BD、BD主管、城市经理等展开各种计算。
 
虽然我们的 JobCenter 是很优秀的定时任务调度和管理平台,但它没有步骤(即定时任务之间的依赖关系)的概念,所以以前我们只好拍脑袋定 Job1 凌晨1点执行,Job2 凌晨2点执行,Job3和Job4放在3点执行,显然这只是无奈之举,万一 Job1 跑到凌晨3点才算完怎么办?万一 Job1 执行失败了怎么办?
 
什么是步骤?我们可以用下图来理解一个大计算任务下步骤之间的依赖关系:
图1
为了应对这种数据量很大的抽取和一环套一环的计算,我们需要另行发展一个界面友好的、有步骤概念的、有集群调度的数据计算系统,以充分利用机器资源。
 
0x01,他山之玉:azkaban2/oozie/mesos
计算资源的调度,好学生有不少,如针对 hadoop 集群调度和管理的 azkaban2 和 oozie,抽象能力更高的分布式资源管理框架 apache mesos。
项目开始之初,我希望借鉴 oozie 和 azkaban2 的一些优秀设计思路,我们其实也是做调度和管理,只不过它们基于 hadoop,我们基于 mysql 而已。
 
给我深刻印象的调度系统特性有:
  1. 计算任务有步骤定义,输入输出都有灵活的定义,适合于数据收集、清洗、聚合、计算等各种常见计算场景;
  2. 步骤可以通过依赖关系来定义串行还是并行;
  3. 可以很直观地看到当前任务执行时跑到了哪一个步骤,或者哪些计算小任务;
    • 如 oozie 的界面
  4. 可以很直观地收集和展示当前任务里的输出流以及异常日志流;
  5. 可以很方便地暂停、终止、重启任务,无需担心遗留垃圾中间数据;
  6. 有报警机制,有一些简单指标展示;
  7. 计算任务的步骤定义视觉化
    • 如 azkaban2 的界面
于是,国玺李红红他们开始动手设计。最终出来的效果还不错,下面介绍一下。
后来我们的容器私有云用了 apache mesos,我觉得 mesos 这种高度抽象的资源调度和管理系统非常适合我们的数据并行计算应用场景,于是假想了一番:我们写调度器去和 mesos 通信,告诉它要去执行什么命令,它去负责在整个 cluster 里调度;我们写的工程以及控制台有点儿像 marathon,依托于 mesos+chronos;我们写的从不同数据源抽取原始数据、计算佣金的代码,打成 jar 包后放在 mesos master 上,配置好后,mesos slave 真的接到调度指令去运行时,会自己从 master 节点下载 jar 包并执行,blabla……这样 mesos 能替我们省了不少开发工作。
 
0x02,Summoner的特性
下面介绍一下我们针对数据计算的分布式并行计算调度系统——Summoner(魔法师)。
我们命名一个大计算任务为『工作流』,工作流下有多个任务,任务彼此之间可以可视化地建立依赖关系。
工作流可以设定 Quartz cron 表示式从而定期执行,可以直观地看到任务执行的进度,执行日志、异常日志,状态。
我们还可以复用任务,一个任务可以隶属于多个工作流。这样当佣金计算规则变化时,我们只需要复用一部分任务,新增一些任务,另建一个新工作流把任务串起来即可,同时把原来的工作流禁用,这样进退自如。
负责执行任务的客户端(jar包)能够自动注册(通过 Zookeeper),于是系统知道现在有多少个机器节点可以执行某一个任务。
于是,假如任务B有了10个客户端注册,任务A抽取了一千万条交易记录,系统将这批记录分拆为十份,发给10个任务B客户端,于是任务B将在多个机器节点上并行计算,然后系统再去调度任务C。
 
它的菜单功能有:
  • 资源配置管理
    • 工作流管理
    • 任务管理
    • 依赖关系管理
    • 注册管理(客户端注册和服务器端注册)
  • 任务调度管理
    • 调度管理
  • 实时数据管理
    • 工作流执行情况
  • 调度日志管理
    • 调度日志
 
下面是首页工作台,我们可以看到自己帐号下有多少个工作流执行完成/失败/暂停执行/取消执行,以及系统报警和信息的通知。
图2 summoner首页工作台
 
首先,我们需要建立工作流:
图3 资源配置管理-工作流管理
 
我们还要把任务建起来,任务真正的执行者是一个 Java 实现的任务处理类:
图4 任务管理
 
图5 编辑任务
其次,我们要任务之间的依赖关系建立起来:
图6 依赖关系管理
 
然后管理工作流:
图7 工作流图管理
我们可以让工作流立即执行,来观察它的进度:

图8 调度日志管理
 
以及每一个任务的进度:
图9 工作流执行详情
 
集群里不同节点都可能会卷入工作流执行,它们产生的日志会被 flume 聚合,之后在平台上实时展示:
图10 工作流执行日志
 
图11 客户端注册
 
图12 服务器端注册
 
图13 系统通知
 
Summoner 是 JobCenter 的延伸和有益补充,它们各自有各自的应用场景。我们还会借鉴 mesos 的先进理念,进一步提升 Summoner 的集群调度能力。
 
-EOF-
20160108注:2015年年底也看到了当当网对它的“分布式任务调度框架:当当elastic-job开源项目的10项特性”做了阐述,有一些理念相似,如任务分片,分布式,值得我们进一步学习。

欢迎阅读我的其他电商文章:
  1. 内部Hybrid App经验解读
  2. iDB是如何运转的 一
  3. #研发解决方案#iDB-数据库自动化运维平台
  4. 容器私有云和持续发布都要解决哪些基础问题 第二集
  5. 容器私有云和持续发布都要解决哪些基础问题 第一集
 
欢迎订阅我的微信订阅号『老兵笔记』,请扫描二维码关注:
 

#研发解决方案#分布式并行计算调度和管理系统Summoner的更多相关文章

  1. #研发解决方案介绍#Tracing(鹰眼)

    郑昀 最后更新于2014/11/12 关键词:GoogleDapper.分布式跟踪.鹰眼.Tracing.HBase.HDFS. 本文档适用人员:研发   分布式系统为什么需要 Tracing?   ...

  2. #研发解决方案介绍#IdCenter(内部统一认证系统)

    郑昀 基于朱传志的设计文档 最后更新于2014/11/13 关键词:LDAP.认证.权限分配.IdCenter. 本文档适用人员:研发   曾经一个IT内部系统配一套帐号体系和授权   线上生产环境里 ...

  3. #研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案

    郑昀 基于李丹和刘奎的文档 创建于2014/12/5 关键词:监控.dashboard.PHP.graphite.statsd.whisper.carbon.grafana.influxdb.Pyth ...

  4. #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

    郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...

  5. #研发解决方案介绍#Recsys-Evaluate(推荐评测)

    郑昀 基于刘金鑫文档 最后更新于2014/12/1 关键词:recsys.推荐评测.Evaluation of Recommender System.piwik.flume.kafka.storm.r ...

  6. 利用 MessageRPC 和 ShareMemory 来实现 分布式并行计算

    可以利用 MessageRPC + ShareMemory 来实现 分布式并行计算 . MessageRPC :  https://www.cnblogs.com/KSongKing/p/945541 ...

  7. 分布式开源调度框架TBSchedule原理与应用

    主要内容: 第一部分 TBSchedule基本概念及原理 1. 概念介绍 2. 工作原理 3. 源代码分析 4. 与其它开源调度框架对照 第二部分 TBSchedule分布式调度演示样例 1. TBS ...

  8. JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案

    JAVA系统架构高并发解决方案 分布式缓存 分布式事务解决方案

  9. #研发解决方案#discache-分布式缓存查询与管理系统

    郑昀 基于马海元和闫小波的文档 关键词:memcached.redis.分布式缓存.控制台.反序列化.Java 本文档适用人员:研发和运维员工 提纲: 如何查看缓存里的序列化数据? 批量删除来一个 监 ...

随机推荐

  1. POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)

    实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...

  2. SQL 统计两个表的数据,按同一日期分组

    思路:把两个表的数据按日期整合到临时表在按日期分组,求和. 例子: SELECT t.dateTime AS '日期',SUM(t.money) AS '表1利息',SUM(t.interest) A ...

  3. _NSInlineData objectForKeyedSubscript:

    最近总是遇到这个错误:reason: '-[_NSInlineData objectForKeyedSubscript:]: unrecognized selector sent to instanc ...

  4. git 学习

    一.bash中查看已经提交的文件:git ls-files 二.返回上级目录:cd ..     (中间含空格) 三.在当前目录下新建文件夹: mkdir dirName 新建文件:touch new ...

  5. iOS 数据存储规则

    概观 iCloud的备份包括,它可以自动每天通过Wi-Fi备份用户的iOS设备.在您的应用程序的主目录都被备份,唯一的例外是应用程序本身捆绑,缓存目录和temp目录.购买的音乐,应用程序,电子书,相机 ...

  6. python之路:Day02 --- Python基础2

    本节内容 1.列表操作 2.元组操作 3.字符串操作 4.字典操作 5.集合操作 6.文件操作 7.字符编码与转换 一.列表操作 定义列表 names = ['Ming',"Hua" ...

  7. Android Studio上NDK/JNI开发环境问题

    基础环境: 操作系统 —— Windows 7 Android Studio —— 1.5.1(android-studio-bundle-141.2456560-windows.exe) NDK — ...

  8. java中的集合/容器的数据结构

    最近双11在网上买了本 数据结构和算法--java语言实现,正在啃,同时在慕课网上的学习进度来到了集合框架这一类,对于这一块算是刚刚了解,本科的时候数据结构学习的是严蔚敏老师的那本数据结构,代码的实现 ...

  9. kaggle入门2——改进特征

    1:改进我们的特征 在上一个任务中,我们完成了我们在Kaggle上一个机器学习比赛的第一个比赛提交泰坦尼克号:灾难中的机器学习. 可是我们提交的分数并不是非常高.有三种主要的方法可以让我们能够提高他: ...

  10. 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】

    一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...