Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flink 数据湖 助力美团数仓增量生产

Flink 数据湖 助力美团数仓增量生产

作者头像
kk大数据
发布于 2020-12-29 02:21:56
发布于 2020-12-29 02:21:56
1.7K0
举报
文章被收录于专栏:kk大数据kk大数据

一、美团数仓架构图

如上图,是美团最新的数仓架构图。

整个架构图分为三层,从下往上看,最下面一层是数据安全,包括受限域认证系统、加工层权限系统,应用层权限系统,安全审计系统,来保证最上层数据集成与处理的安全;

中间一层是统一的元数据中心和全链路血缘,覆盖了全链路的加工过程;

最上层根据数据的流向,分成数据集成,数据处理,数据消费,数据应用,四个阶段;

在数据集成阶段,对于不同的数据来源(包括用户行为数据,日志数据,DB 数据,文件数据),都有相对应的数据集成系统,把数据收集到统一的存储之中,包括 KafkaHive 等。

在数据处理阶段,有一个面向用户的数据开发平台(万象平台),可以使用两条数据处理链路来加工数据,一个是流式处理链路,一个是离线处理链路。

数据加工好了之后,使用内部自研的 DeltaLink 同步数据到其他的应用中,例如即席分析,即席查询,报表等应用。

上图中标红的地方,Kafka -> HDFS,Flink,DeltaLink 是本次重点分享的内容。

二、美团当前 Flink 应用场景和规模

美团 Flink 应用场景包括:

  • 实时数仓、经营分析、运营分析、实时营销
  • 推荐、搜索
  • 风控、系统监控
  • 安全审计

Flink 集群规模如下(高峰流量是每天最高峰的流量):

三、基于 Flink 的流式数据集成

数据集成经历了多个版本的迭代

1. 数据集成 V1.0

V1.0 版本很简单,是完全批量同步的架构。

在数据量比较少的情况下,这样的批同步的架构,优势很明显,架构简单,非常简单易于维护。

但是缺点也很明显,光是数据传输就 1 - 2 个小时。

2. 数据集成 V2.0

在 V2.0 中,增加了流式传输的链路(下面的链路),把数据实时传输到 ODS 中(批量传输的链路仍然是必须的,作为第一次全量的导入)。

流式传输系统,使用 canal (阿里开源) 采集 Mysql 的 binlog 日志到 kafka。后边有一个 Kafka2Hive 系统,这个系统经过了多个版本的迭代。

Kafka2Hive 模块,最开始是使用 Camus ,每一个小时拉一次数据,跑在 Spark 上。后面改成使用 SparkStreaming ,但是 Spark Streaming 在资源的利用方面有一些问题的,所以最终弄全部迁移到了 Flink 框架上来。

这样的架构,优势是非常明显的:把数据传输放在了 T+0 的时间去做,T + 1 的时间只需要经过一次 Merge 即可,花费的时间可能就从 2 - 3 个小时减少到 1 个小时了,提升是非常明显的。

3. 数据集成 V3.0

数据集成 V3.0 的架构,前面的部分和 V2.0 一样,关键的是后面这一部分。

在 V2.0 架构中,凌晨需要对数据做一次 Merge,这个操作对于 Hdfs 的压力非常大,要把几十 T 的数据读过来,清洗一遍,再把几十 T 的数据写入到 Hdfs。

所以,在 V3.0 架构中,引用了 Hidi 架构(Hidi 是美团内部基于 Hdfs 开发的类似 Hudi 或者 Iceberg 的文件格式)。

4. 美团自研的 Hidi

要做到增量生产,最关键的特性在于

  • 支持增量读取,也就是读取当前时间到前一段时间的数据, 才能做到增量;
  • 支持基于主键的 Upsert/Delete。Hidi 是美团在 2,3 年前,在内部自研的架构,此架构的特性在于:
  • 支持 Flink 引擎读写;
  • 通过 MOR 模式支持基于主键的 upsert/Delete;
  • 小文件管理 Compaction;
  • Table Schema

可以对比 Hidi、Hudi、Iceberg,如下:

Hudi 最亮眼的特性是支持基于主键的 Upsert/Delete,但劣势是深度和 Spark 绑定,但在国内 Flink 框架这么火热的情况下,难免会有点美中不足。

Iceberg 不依赖于执行引擎,可以深度和 Flink 集成。

美团自研的 Hidi 则根据自己的需求实现了诸多的特性,目前仍然在完善中。

四、基于 Flink 的增量生产

1、传统离线数仓特性分析

一般我们说数仓,都是指离线数仓。离线数仓有三个重要的指标,一是时效性,二是质量,三是成本。

首先是时效性,有两个更深层次的含义,一个是实时,一个是准时。

实时就是实时流式处理,来一条处理一条,实时处理消耗的资源很多。

准时,就是按时处理。比如广告需求,可能只需要在每个整点,统计过去一小时或者在每个整点统计当天的数据即可,没有必要做到实时,只需要到点能产出数据就行。

所以,总结下来,离线数仓和实时数仓各有利弊,离线数仓在质量和成本上会有优势,但是时效性不足;实时数仓,在时效性上很有优势,但是质量和成本都略逊色。

2. 增量生产

如下图,是离线数仓、实时数仓和增量计算的对比

所谓增量计算,就是企业在时效性、质量、成本上做一个权衡,时效性需要高一点,但是不用做到 RealTime,OnTime 也可以接受( 8 点看报表,提前到 3 点计算好也没有很大的意义),但是质量要高,成本也需要尽量少。

3. 增量计算的优点

增量计算最大的优点,就是可以尽快的发现问题。

一般我们会在第二天花 8 个小时到 12 个小时,把前一天的数据生产出来。但是如果第二天发现数据错了,可能要花一天的时间去修复数据,这个时候,准时性和质量都被打破了。

如下图,横坐标是时间(T 表示当天,T+1 表示第二天),黑色线表示离线生产,大概利用 T + 1 一半资源去生产。红色线是实时生产,在当天就生产数据,占用的资源比离线计算高。

下图是增量生产的示意图。

绿色线是增量计算,在当天就计算好。

黑色线是离线计算,在第二天的前半天计算。

增量计算,是在当天计算,在当天就能提前发现问题,避免 T + 1 修复数据。并且还可以充分利用资源,提前产出数据的时间,并且占用资源更少。

4. 增量生产架构图

下图是美团增量生产的架构图(目前的架构正在逐步完善中,还没有完全实现)

如图,最上面是实时处理的链路,Flink 消费 Kafka 数据 到 下游的 kafka,输出结果给下游使用或者供 OLAP 分析。

下面的链路是批处理,首先 kafka 数据经过 Flink 集成到 HDFS,再通过 Spark 做离线的生产,最终经过 Flink 导出到 OLAP 应用里面去。

上文提到的增量生产,就是图中标绿色的部分,希望可以用增量生产来替换掉 Spark 离线计算,做到计算引擎的统一。

要能支持增量生产,需要具备几个核心的能力:

  • Flink SQL 能力能够对齐 Spark SQL;
  • Hidi 支持 Upsert/Delete 特性(Hidi 已支持);
  • Hidi 支持全量和增量的读取,全量读取用于查询和修复数据,增量读取用来增量生产;

五、实时数仓模型与架构

如下图是实时数仓的模型,基本上都见过

下图是实时数仓平台的架构图

整个架构,分为资源层、存储层、引擎层、SQL 层、平台层和应用层。

六、流式导出与 OLAP 应用

1. 异构数据源的同步

如上图,是异构数据源的同步。数据会在不同的存储系统中交换,所以我们做了一个 Deltalink 的平台,把数据 N 对 N 的交换过程,抽象成 N 对 1 的交换过程。

我们也迭代改进了很多版本。

2. 第一版实现

第一版是基于 DataX (阿里开源)来做同步,包含工具平台层,调度层,执行层。

  • 工具平台层,对接用户,用来配置同步任务,配置调度,运维任务;
  • 调度层,负责任务的调度,管理任务状态管理,以及执行机的管理,这其中有非常多的额外工作都需要自己做;
  • 执行层,通过 DataX 进程,以及 Task 线程从源存储同步到目标存储。

但劣势也很明显,开源版的 DataX 是一个单机多线程的模型,当数据量非常大的时候,单机多线程是成为了瓶颈,限制了可扩展性;

然后在调度层,需要管理机器,管理同步的任务和状态,非常繁琐;

当调度执行机发生故障的时候,整个灾备都需要单独去做。

3. 第二版实现

在第二版中,改成了基于 Flink 同步的架构,看起来就清爽了很多。

工具平台层没有变,调度层的任务调度和执行机管理都交给 Yarn 去做。

调度层的任务状态管理,可以迁移到 Client 中去做。

基于 Flink 的 DeltaLink 的架构,解决了可扩展性问题,而且架构非常简单。

当把同步的任务拆细之后,可以分布式的分布到不同的 TaskManager 里去执行。

并且离线和实时的同步,都可以统一到 Flink 框架中去,这样离线和实时同步的 Source 和 Sink 组件都可以共用一套。

4. 基于 Flink 的同步架构关键设计

  1. 避免跨 TaskManager 的 Shuffle,避免不必要的序列化成本;Source 和 Sink 尽量在同一个 TaskManager;
  2. 务必设计脏数据收集旁路和失败反馈机制;数据同步遇到脏数据的时候,比如失败了 1% 的时候,直接停下来;
  3. 利用 Flink 的 Accumulators 对批任务设计优雅退出机制;数据传输完之后,通知下游数据同步完了;
  4. 利用 S3 统一管理 Reader/Writer 插件,分布式热加载,提升部署效率;很多传输任务都是小任务,而作业部署时间又非常长,所以需要要提前部署插件;

5. 基于 Flink 的 OLAP 生产平台

基于 Flink 做了 Deltalink ,数据导出的平台;

基于数据导出的平台,做了 OLAP 平台,对于资源,模型,任务和权限都做了管理。

七、 未来规划

经过多次迭代,把 Flink 用到了数据集成、数据处理、离线数据导出、OLAP 等场景,但事情还没有结束。

未来的目标,是要做到流批一体,把离线作业都迁移到 Flink 上来;

同时数据也要做到批流一体,这个很重要。如果数据仍然是两份,是两套 Schema 定义,那么不管如何处理,都需要去对数据,就不是真正的流批统一。

所以不管是计算还是存储,都使用 Flink,达到真正的流批一体。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 KK架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring boot使用Maven Profile配合Spring Profile进行多环境配置和打包
但是用了Maven Profile之后,我打包就不用每次都改application.yml文件了
ydymz
2021/01/05
3.3K1
Spring boot使用Maven Profile配合Spring Profile进行多环境配置和打包
SpringBoot多文件配置根据环境加载不同配置
在平时开发时,会发现公司的项目会不同的环境使用到不同的配置。如本地,测试,预发布,发布等环境,像数据库这些都要使用到不同的配置。如果只有一个配置文件,发布到不同环境的时候都要去修改一遍那简直就是遭罪,那么,如何实现SpringBoot根据需要去加载不同的配置文件?
青衫染红尘
2021/01/19
2.2K0
SpringBoot多文件配置根据环境加载不同配置
SpringBoot 多环境打包配置
实际开发中,应用程序通常需要部署到不同的运行环境中,例如 开发环境、测试环境、生产环境等。
默存
2023/11/20
9650
SpringBoot 多环境打包配置
Maven 打包实现生产环境与测试环境配置分离
在使用maven的过程中会发现一个问题,由于生产环境跟测试环境的配置不通,所以在分别打两个环境的包时,往往需要人工参与去修改配置文件,而人工参与的次数越大错误的几率就会越大,那maven能不能再不用人工修改配置文件的前提下来分别打两个环境的包呢,当然可以。
shengjk1
2018/10/24
1.4K0
Spring Boot系列之-profile
Spring Boot profile用于分离不同环境的参数配置,通过spring.profile.active参数设置使用指定的profile。
编程随笔
2019/09/11
7440
Maven 利用 profile 进行多环境配置
我们在进行项目的多环境配置时,有很多种方式供我们选择,比如 SpringBoot 自带的 application-dev.yml、maven 的 profile 等。这里介绍的就是如何利用 profile 进行多环境配置。
JMCui
2019/11/26
9740
Maven 利用 profile 进行多环境配置
原来实现项目多环境打包部署是如此的简单
   在软件开发和部署过程中,我们的软件往往需要在不同的运行环境中运行,例如:开发人员本地开发环境、测试团队的测试环境、生产仿真环境、正式生产环境,不同的公司可能还会有更多的环境需要对项目配置进行动态切换。项目在这些环境切换的过程中,往往会有一部分配置是所有的环境都相同的,还有一部分是不同环境都不相同的(最典型的就是数据连接配置文件jdbc.properties),如果我们不做特殊配置,那么我们就需要根据环境来修改配置文件,不同环境来回修改和切换,不仅容易出错,而且很繁琐,那么这时候我们在想:有没有办法可以能够让我们不用修改配置就能发布到不同的环境中呢?答案显而易见,那么本文我们就通过三种方式来解决这个问题。从而把我们的软件的可移植性提高一个层次。
阿豪聊干货
2018/08/09
1.4K0
聊聊基于maven的springboot的“过时”用法
接触过许多工程,发现有一些基于maven的springboot工程还是使用maven的profile,有些"过时"了,下面简单介绍一下。
code4it
2023/09/17
2750
SpringBoot 多环境设置 active: @profileActive@
本文最后更新于 2022年12月13日,已超过 48 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
仙士可
2023/02/01
2.7K0
SpringBoot 多环境设置 active: @profileActive@
maven多环境配置文件
pom文件 <profiles> <profile> <!-- 开发环境 --> <id>dev</id> <properties> <environment>dev</environment><!-- 节点名字environment是自己随意取的 --> </properties>
东营浪人
2019/09/05
1.1K0
Maven构建配置和激活SpringBoot配置文件
本文最后更新于 511 天前,其中的信息可能已经有所发展或是发生改变。 一、Maven配置里使用SpringBoot配置里的属性 <resource> <directory>src/main/resources/${profiles.active}</directory> <filtering>true</filtering> <includes>
Yuyy
2022/09/21
1.2K0
Maven多环境配置
多数项目都会有开发环境、测试环境、生产环境,各个环境配置可能都会不一样,于是在构建时,会涉及到环境配置的切换。来回手工修改配置,效率低下,容易出错。可以配置多个含有不同环境配置的Profile,在构建时指定构建环境,达到多环境下快速灵活构建的目的。
布禾
2020/10/29
5320
Maven多环境配置
嗯,挺全乎儿的,Spring Boot 多环境配置都在这里了,你喜欢哪种?
日常开发中至少有三个环境,分别是开发环境(dev),测试环境(test),生产环境(prod)。
huofo
2022/03/16
2K0
嗯,挺全乎儿的,Spring Boot 多环境配置都在这里了,你喜欢哪种?
springboot分环境配置文件
这里只是为了演示,具体几个配置文件还得根据需求来,有的还有什么UAT环境、灰度环境等,不过没什么,无非就是再添加配置文件和相应pom文件调整一下罢了。另外application.properties中最好放置一些不会改变的配置项,比如说端口。
田维常
2019/07/30
9170
springboot分环境配置文件
Spring Boot(03):Spring Boot多环境配置,如何轻松实现开发、测试、生产环境切换?
环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
bug菌
2023/09/04
1.8K0
Spring Boot(03):Spring Boot多环境配置,如何轻松实现开发、测试、生产环境切换?
Maven系列第9篇:多环境构建,作为核心开发,这个玩不转有点说不过去!
整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。
路人甲Java
2019/11/29
1.2K0
Maven系列第9篇:多环境构建,作为核心开发,这个玩不转有点说不过去!
Maven根据Profiled读取不同配置文件
在日常开发中,我们大多都会有开发环境(dev)、测试环境(test)、生产环境(prod),不同环境的参数肯定不一样,我们需要在打包的时候,不同环境打不同当包,如果手动改,一方面效率低,容易出错,而且每次打包都改动,非常麻烦,所以Maven给我们提供了profile的配置。
全栈程序员站长
2022/08/13
5790
Maven根据Profiled读取不同配置文件
如何实现根据环境切换不同配置?
拿开发环境和正式环境来说,比如开发环境的nacos地址是nacos.dev.biggerboy.com:8848而正式环境是nacos.biggerboy.com:8848
编程大道
2023/03/17
7810
如何实现根据环境切换不同配置?
这波啊~这波是多环境配置
一般来说,在日常开发中都会分多个环境,比如git代码分支会分为dev(开发)、release(测试)、pord(生产)等多个环境。可以说每个环境对应的配置信息(比如数据库、缓存、消息队列MQ等)都不相同。因此不同的环境肯定需要对应不同的配置文件。接下来学习一下怎么配置多环境的配置文件。
java技术爱好者
2021/11/19
5650
SpringBoot项目的pom文件配置多yml源,打包的时候手动选择yml配置
如果要打包为jar包,也是先选择哪个配置文件,然后刷新,之后打包,一定要刷新,不管什么操作最后都要刷新,选择的配置文件才可以生效;
一写代码就开心
2022/09/27
1.5K0
SpringBoot项目的pom文件配置多yml源,打包的时候手动选择yml配置
推荐阅读
相关推荐
Spring boot使用Maven Profile配合Spring Profile进行多环境配置和打包
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入[后端] 腾讯云技术交流站
后端架构设计 高可用系统实现
加入[游戏服务器] 腾讯云官方交流站
游戏服运维小技巧 常见问题齐排查
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档