角色

设计开发负责人

背景

数据采集入库整体流转图 ua003 由于flume没有写Parquet文件的功能,而hive和impala中parquet列式文件存储格式效率比较高,
所以flumeServer消费kafka的数据,根据配置写到hdfs上面到sequence文件格式需要转化程parquet文件格式,
同时flumeServer写到本地磁盘上面的的文本格式文件需要入库到mysql中。
所以设计开发了asima动态数据入库系统,
把1分钟1个分区目录中的文件转换成parquet文件格式写到impala中,
把本地磁盘上的文件写到mysql中。

后来变更

  • 增加了flumeParquetSink组件,直接写ImpalaParquet表
  • 增加了flumeKuduSink组件,直接写ImpalaKudu表
  • 增加了flumeMysqlSink组件,直接写入mysql/tidb表
  • 增加了flumeClickhouseSink组件,直接写入clickhouse表

版本变更

先后经历过1.0, 2.0, 3.0三个大版本

面临的问题(1.0和2.0)

  1. 数据晚到(网络故障,采集延迟,消费延迟,数据堆积,时钟错误,上报问题)
  2. 集群故障 (不丢失数据,不重复入数据)
  3. 280多个接口如何保证在1分钟内入完
  4. 分区太多,如何清理,减少元数据占用,小文件占用资源
  5. 如何在入库的过程中过滤掉异常数据(历史数据,未来数据,脏数据)
  6. 入库执行情况跟踪
  7. 是否可以根据目录切割粒度进行入库
  8. 如何兼容多个不同的集群配置
  9. 如何让重要的任务先入库 ……

开发工具

  1. 开发语言python2.7.13
  2. 开发框架Flask,MySQL-python,requests,click,impyla等
  3. 数据存储mysql5.7
  4. 数据缓存redis

系统架构

ua003 项目采用Master/Worker模式,部署两条Master,多台Worker
Master负责提供服务,操作数据,操作缓存
Worker负责执行具体的入库任务,清理任务,补录任务等
数据存储核心有两张表,任务配置表,Job配置表

  1. 任务生成进程:负责每分钟调用接口,生成需要入库的任务实例,写入DB,同时写入Redis缓存队列
  2. 任务补录进程:是手工调用或监控调用,生成缺失的Job实例
  3. 监控告警进程:负责统计入库任务堆积情况,runner并发情况,失败情况
  4. 分区维护进程:负责Job表分区的增加和删除工作
  5. Worker上面进程:从Master请求Job,进行实际的入库,并上报各种状态到Master
  6. 监控重启进程:负责Worker健康状态检查

功能模块

  1. 任务管理
  2. Job管理
  3. 分区管理
  4. 监控告警管理
  5. 心跳管理
  6. worker控制
  7. runner开发

使用情况

asima动态入库系统是数平在由Hadoop1.0老集群往CDH自建集群迁移的过程中,
需要解决数据使用效率的问题而发起的一个项目。
系统历经三次大的版本迭代,期间前两个版本出现重启丢失数据,数据无法补录,入库效率低,脏数据等问题,
从2018年6月开始重新设计新的入库架构,2018年07月开始开发,2018年10月完成开发,开始灰度,
2018年11月灰度完成,新的入库系统3.0正式、上线,解决了之前遇到的各种问题。
新入库系统每分钟完成数平281个接口的准实时动态入库,接入配置化,每分钟入库峰值3.7亿条,
每天入库2470亿,最大接口每分钟7750万,每天560亿,系统可用性99.99%,
监控,告警,重启,日志,入库数据分析等很多功能做到自动化处理。