搜索

每日7千次的跨部门任务调度有赞怎么设计大数据开发平台? - cpon

gecimao 发表于 2019-07-19 23:25 | 查看: | 回复:

  随着公司规模的增长,对大数据的离线应用开发的需求越来越多,这些需求包括但不限于离线数据同步(MySQL/Hive/Hbase/Elastic Search 等之间的离线同步)、离线计算(Hive/MapReduce/Spark 等)、定时调度、运行结果的查询以及失败场景的报警等等。

  多个开发和调度入口,不同的业务部门之间的项目或组件很难复用,同时带来繁重的运维成本

  Hadoop 的环境对业务团队的同事来讲不友好(除了要熟悉业务以外还需要对底层框架有比较深入的了解)

  重复的开发工作(例如导表、调度等本来可以复用的模块,却需要在多个项目中重复实现)

  为了解决上述遇到的各类问题,同时参考了业界其他公司的大数据解决方案,我们设计并实现了大数据开发平台(Data Platform,简称 DP),通过可视化的交互界面,解决离线大数据计算相关的各种环境和工具。

  大数据开发平台包括调度模块(基于开源airflow二次开发)、基础组件(包括公共的数据同步模块/权限管理等)、服务层(作业生命周期管理/资源管理/测试任务分发/Slave管理等)和监控(机器资源/日志/基于预测的监控)。这些模块具体功能和职责为:

  任务调度模块:支持基于任务优先级的多队列、分布式调度。在开源的 airflow 基础上进行了二次开发,主要新增功能包括:

  增加多种任务类型(datax/datay/导出邮件/导出es/Spark等)

  根据任务的上下游关系以及重要程度,计算任务的全局优先级,根据全局优先级调度(优先级高的优先执行,低的则进入队列等待)

  跨 Dag 的任务依赖关系展示(基于全局 Dag,通过任务的读写Hive表信息建立跨 Dag 的依赖关系)

  基础模块:包括离线的全量/增量数据同步、基于Binlog的增量同步、Hive 导出 ES /邮件、MySQL 同步到 Hbase (开发中)等,参考图2。

  服务模块:负责作业的生命周期管理,包括作业的创建(修改)、测试、发布、运维等,服务部署采用 Master / Slave 模式,参考图3所示。其中

  Master 节点支持 HA 以及热重启(重启期间另外一台提供服务,因此对用户是无感知的)。Master 节点的主要职责是作业的生命周期管理、测试任务分发、资源管理、通过心跳的方式监控 Slaves 等。

  Slave 节点分布在调度集群中,与 Airflow 的 worker 节点公用机器。Slave 节点的主要职责是执行 Master 分发的命令(包括测试、机器监控脚本等)、更新资源(通过 Gitlab )等。

  监控模块:对调度集群的机器、资源、调度任务进行全方位的监控和预警。按照监控的粒度和维度分成三类:

  基础监控:结合运维监控(进程、IO等)和自定义监控(包括任务环比波动监控、关键任务的产出时间监控等)对DP的Master节点和Worker节点进行基础的监控和报警。

  日志监控:通过将任务运行时产出的日志采集到 Kafka,然后经过 Spark Steaming 解析和分析,可以计算每个任务运行的起止时间、Owner、使用到的资源量( MySQL 读写量、 Yarn 的 CPU / Memory 使用量、调度 Slot 的占用情况等),更进一步可以分析Yarn任务的实时运行日志,发现诸如数据倾斜、报错堆栈信息等数据。最后将这些数据存储在 NoSQL(比如 Redis )以进一步的加工和展示。

  任务预测监控:通过提前一段时间模拟任务的调度(不真正的跑任务),来预测任务的开始/结束时间,同时可以提早知道可能失败、超时的任务列表,进而在问题发生之前进行规避。

  现阶段已经实现的功能:分析可能失败的任务列表(失败的原因可能是DB的配置发生更改、上游的节点失败等)并发送告警信息;基于过去一段时间的运行时间数据,模拟整个任务调度,可以计算出任务的开始/结束时间以及超时告警。

  未来规划:任务的运行时长不是基于过去的数据,而是通过读取的数据量、集群资源使用率、任务计算复杂程度等多个特征维度来预测运行时长。

  大数据开发平台的任务调度是指在作业发布之后,按照作业配置中指定的调度周期(通过 crontab 指定)在一段时间范围内(通过开始/结束时间指定)周期性的执行用户代码。任务调度需要解决的问题包括:

  为了解决上述问题,我们调研了多种开源框架(Azkaban/Oozie/Airflow等),最终决定采用 Airflow + Celery + Redis + MySQL 作为 DP 的任务调度模块,并结合公司的业务场景和需求,做了一些深度定制,给出了如下的解决方案(参考图4):

  针对问题2,一方面通过 Airflow 提供的 Pool + Queue + Slot 的方式实现任务并发个数的管理,以及把未能马上执行的任务放在队列中排队。另一方面通过 Celery 可以实现了任意多台Worker的分布式部署(水平扩展),理论上调度没有并发上限。

  针对问题3,在 Airflow 本身支持的优先级队列调度基础之上,我们根据任务的上下游关系以及标记重要的任务节点,通过全局DAG计算出每个节点的全局优先级,通过将该优先级作为任务调度的优先级。这样可以保证重要的任务会优先调度,确保重要任务产出时间的稳定性。

  针对问题4,首先不同类型的任务需要耗费不同类型的资源,比如 Spark 任务是内存密集型、Datax 任务是 CPU 密集型等,如果将同一类任务集中在一台机器上执行,容易导致部分系统资源耗尽而另外一部分资源空闲,同时如果一台机器的并发任务数过多,容易引起内存 OOM 以及 CPU 不断地切换进程上下文等问题。因此我们的解决方式是:

  将任务按照需要的资源量分成不同类型的任务,每种类型的任务放到一个单独的调度队列中管理。

  基于这些配置,我们可以保证每台 Worker 机器的 CPU /内存使用率保持在相对合理的使用率范围内,如图5所示

  针对问题5,任务调度模块涉及到的角色包括 Scheduler (生产者)和 Worker (消费者),因为 Worker 本来就是分布式部署,因此部分机器不可用不会导致整个调度的不可用(其他节点可以继续服务)。而 Scheduler 存在单点问题,我们的解决方案是除了 Active Scheduler 节点之外,新增一个 Standby Scheduler(参考图3),Standby节点会周期性地监听 Active 节点的健康情况,一旦发现 Active Scheduler 不可用的情况,则 Standby 切换为 Active 。这样可以保证 Scheduler 的高可用。

  DP项目从2017年1月开始立项开发,6月份正式投入生产,之后经过了N能迭代,在易用性和稳定性方面有了显著提升,目前调度集群包括2台Master和13台 Slave(调度)节点(其中2台用于 Scheduler ,另外11台用于 Worker ),每天支持7k+的任务调度,满足数据仓库、数据中心、BI、商品、支付等多个产品线 DP调度任务数趋势图

  从 Hive 到 MySQL 的全量/增量数据同步(基于 Datax 二次开发)

  从 MySQL 通过 Binlog ,经过 Nsq/Hdfs/MapReduce 增量同步到 Hive( Datay ,自研)

  从 Hive 同步到 ElasticSearch (基于 Datax 二次开发)

  将 Hive 表数据以邮件形式导出(支持 PDF/Excel/Txt 格式的附件)

  DP 在经过一年半的不断功能迭代和完善之后,目前日均支持7k+的任务调度,同时在稳定性和易用性方面也有了较大的提升,可以满足用户日常对大数据离线开发的大部分使用场景。同时我们也意识到大数据开发这块还有很多可以挖掘和提升的点,未来我们可能会从这些方面进一步完善平台的功能和提升用户体验:

  提供用户首页(空间),提供日常运维工具和管理页面,更加方便任务的集中管理

  任务日志管理优化(包括快速定位出错信息/拉取和分析 Yarn 日志等)

  :大数据平台是有赞共享技术的核心团队之一,该团队主要由数据技术、数据产品、算法挖掘、广告平台四个小团队组成,目前共有34位优秀的工程师组成。

  为了让文章给更多需要的人查看到,我决定将博客搬到CSDN博客,以后将会在两端同时更新文章,原本写博客是为了给自己总结和以后开发想起某样功能做过便于查找的,但是,更为开心的是能够帮助到那些遇到了和我曾经...

  以前学习过PDO,可是在公司使用项目的时候发现有点忘记了,于是花了点时间对PDO再次回顾,我的代码写的很详细了,在注释上有参考案例,有需要的可以在这里下载 ...

  开发的大多数项目并未接触到百万级并发,但是一直以来有个id生成的纠结。我一般就是年月日+随机数生成唯一id,一般来说生成一个备用随机数据,不重复每次一次取值隔天重新从第一个开始取。虽然是可以解决,总感...

  测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况测试情况...

  本来用了好久的kali自己笔记本已经配置的比较完美,新入职一家小公司,用的是php5.6。公司没电脑,只能用自己的,然后各种折腾,结果系统根本不支持php5.6。我的完美系统被搞砸了,熬夜折腾回来一部...

  近期有个关于无限分类关系的统计处理。要求使用树型结构,无奈用了layui的表格展示,外加插件treetable和导出插件excel。针对无限极这块从父级查询子级很长见,但是要从子级查父级一下子懵逼了。...

  这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中...

  这次文章依然很长,基本上涵盖了interface 的方方面面,有例子,有源码分析,有汇编分析,前前后后写了 20 多天。洋洋洒洒,长篇大论,依然有些东西没有涉及到,比如......

  分库分表 php工作5年了,大部分场景都是业务层。说白了就是增删改查。也知道数据库大数据处理分库分表,一般是水平分表和垂直分表,实操是不可能的,今天看了一篇文章《分库分表?如何做到永不迁移数据和避...

  宝马将系统架上微软Azure,国内科技巨头也难抵汽车“诱惑”阅读数869

  f47180383:和大师共事一年,学了很多东西,解决的现实中的很多问题,多谢大师指教

  sxl514286339:我们公司的一个项目用的是 TypeScript,目前在客户现场上线阶段。 目前的问题是: 客户现场的电脑内存只有2G。 运行项目后,打开两个界面,加起来不到200个控件,2个列表数据总行数不超过 100行,内存就飙到了500M。 项目运行2个小时基本都会出现内存超过 1G,然后网页崩溃的情况。 【网页程序 内存超过 1G,这是我10年工作中 从未遇到过的。以前的网页程序,加载 1W行数据我都不放在眼里。现在的TS项目加载200行数据,我都心惊胆颤。】

本文链接:http://olivierlutaud.net/diaodumokuai/798.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部