小米目前的技术架构,在存储侧我们主要应用数据湖 Iceberg 和自研消息队列 Talos,计算层主要应用 Flink 和 Spark,他们统一运行在 Yarn 上,统一通过 Metacat 获取元数据信息,并通过 Ranger 来进行统一的鉴权服务。我们内部使用 Spark 和 Presto 来支撑 OLAP 查询场景,并通过 Kyuubi 来实现路由。
在实时数仓场景中,我们选择 Flink 作为计算底座,Hive、Talos、Iceberg 作为存储底座,其中,消息队列 Talos 作为传统 Lambda 架构的通用选择,在我们内部占比较大且很稳定,Iceberg 作为一款优秀的湖存储,兼具时效性和低成本,其使用占比也在逐步提升,使用到 Iceberg 的 Flink 作业在总占比中已经达到近 50%。
在引入数据湖前,针对日志埋点这样的聚合计算场景,业务会使用离线计算来搭建链路,采集模块会将日志或埋点数据统一收集到消息队列中,Flink 消费消息队列中的数据实时写入 ODS 层 Hive 表,下游的计算则采用 Spark 或者 Hive 按小时或天进行清洗、聚合。显然,这样的链路处理延迟和成本都较高,这些离线作业往往都在凌晨进行调度,给整个集群带来较大压力。