流统计 data-straming 框架说明 1.1 整体架构

目录

代码架构

代码架构主要分 4 层:AppModuleHandlerTransactionalClient,如图:
2020/09/image-1872d65f.png

  • App包含 main() 方法,是程序启动的入口,负责读取配置文件、创建 Spark Streaming 和实例化配置的 Module。启动命令中在 spark-submit 的--class 参数指定,如:spark-submit --class com.mobikok.ssp.data.streaming.App。更多参见:App

  • Module由 App 调用,是根据具体业务逻辑划分的功能模块,一个 App 中至少配置一个 Module 实例。对于实时数据统计案例,一般一个 Module 对应 Kafka 的一个 topic(也支持属同类数据的多个 topic),然后对于这个 topic 的数据做统计处理,当然也可支持将多个 Module 的统计数据进行汇合,形成一张包含来自多个 topic 的多种维度和度量值的统计宽表。更多参见:Module

  • Handler 由 Module 调用,是具体的 ETL 功能组件,比如:去重、过滤、统计、join 和持久化到 hive 等功能组件,根据 ETL 需求在 Module 中配置对应的 Handler。 更多参见:Handler

  • TransactionalClient由 Handler 调用,是 轻量级的支持事务化操作的客户端,它是一个接口,由具体需要事务化操作的组件实现。比如已经实现的几个常用的:
    1)HiveClient:Hive 数据写入支持回滚到以前某一刻的数据;
    2)KafkaClient:对于 Kafka 消费者,支持回滚到之前的偏移。
    他们都实现了TransactionalClient接口中最重要的一个方法rollback(),该方法在 App 启动的时候会被调用,如果发现上一次运行有遗留未被提交的事务 ( 即非调用TransactionalClient.commit()),则会触发真正的回滚。在具体业务中,往往涉及多个组件的事务,即跨组件事务:在一个 spark streaming 批次中所有的组件(TransactionalClient的多个实现类)都提交了事务,才算是完成了事务,但凡有一个组件没有提交事务,就算其它组件提交事务,也会被视为未提交事务,如果在这时宕机了,那么下次重启的时候也会回滚所有组件的事务,它由com.mobikok.ssp.data.streaming.transaction.TransactionManager实现。更多参见:HiveClientKafkaClient

数据架构

对于数据仓库的数据分层,我们采用了简单的 3 层架构:dwi、dwr 和 dm:

  • dwi 即明细数据,一般是从 kafka 的读取过来的原始明细数据。
  • dwr 数据仓库的中间层,一般是各种维度的统计数据。
  • dm 是数据的落地层,是最终给用户用的数据,在我们的流统计中它一般是由 dwr 层的表 join 维表而得到的一个视图宽表,并最终将该视图同步到 clickhouse 或 bigquery 里,为用户提供 OLAP 多维分析查询。

我们约定每一层的表名,是以自身所属的数据层名作为后缀的,比如某一明细表:xxx_dwi,而统计表为:xxx_dwr。当然有一些特殊情况:
1)比如开启了分表统计(即小时表、天表和月表,参考Module),一般小时表为 xxx_dwr,天表为 xxx_dwr_day,月表为 xxx_dwr_month;
2)再如开启了版本功能(参考App 启动参数),启动参数为version=4,则对于的统计小时表一般为 xxx_dwr_v4,天表为 xxx_dwr_v4_day,月表为 xxx_dwr_v4_month。