简介:4.17 上海站 Meetup 胡争老师分享内容:数据入湖的挑战有哪些,以及如何用 Flink + Iceberg 解决此类问题。
GitHub 地址
https://github.com/apache/flink
欢迎你们给 Flink 点赞送 star~node
数据实时入湖能够分红三个部分,分别是数据源、数据管道和数据湖(数仓),本文的内容将围绕这三部分展开。git
数据变动github
当发生数据变动的状况时,会给整条链路带来较大的压力和挑战。如下图为例,原先是一个表定义了两个字段,分别是 ID 和 NAME。此时,业务方面的同窗表示须要将地址加上,以方便更好地挖掘用户的价值。数据库
首先,咱们须要把 Source 表加上一个列 Address,而后再把到 Kafka 中间的链路加上链,而后修改做业并重启。接着整条链路得一路改过去,添加新列,修改做业并重启,最后把数据湖(数仓)里的全部数据所有更新,从而实现新增列。这个过程的操做不只耗时,并且会引入一个问题,就是如何保证数据的隔离性,在变动的过程当中不会对分析做业的读取形成影响。apache
分区变动架构
以下图所示,数仓里面的表是以 “月” 为单位进行分区,如今但愿改为以 “天” 为单位作分区,这可能就须要将不少系统的数据所有更新一遍,而后再用新的策略进行分区,这个过程十分耗时。并发
当业务须要更加近实时的报表时,须要将数据的导入周期,从 “天” 改到 “小时”,甚至 “分钟” 级别,这可能会带来一系列问题。高并发
如上图所示,首先带来的第一个问题是:文件数以肉眼可见的速度增加,这将对外面的系统形成愈来愈大的压力。压力主要体如今两个方面:oop
第一个压力是,启动分析做业愈来愈慢,Hive Metastore 面临扩展难题,以下图所示。优化
第二个压力是扫描分析做业愈来愈慢。
随着小文件增长,在分析做业起来以后,会发现扫描的过程愈来愈慢。本质是由于小文件大量增长,致使扫描做业在不少个 Datanode 之间频繁切换。
你们调研 Hadoop 里各类各样的系统,发现整个链路须要跑得又快又好又稳定,而且有好的并发,这并不容易。
首先从源端来看,好比要将 MySQL 的数据同步到数据湖进行分析,可能会面临一个问题,就是 MySQL 里面有存量数据,后面若是不断产生增量数据,如何完美地同步全量和增量数据到数据湖中,保证数据很少也很多。
此外,假设解决了源头的全量跟增量切换,若是在同步过程当中遇到异常,如上游的 Schema 变动致使做业中断,如何保证 CDC 数据一行很多地同步到下游。
整条链路的搭建,须要涉及源头全量跟同步的切换,包括中间数据流的串通,还有写入到数据湖(数仓)的流程,搭建整个链路须要写不少代码,开发门槛较高。
最后一个问题,也是关键的一个问题,就是咱们发如今开源的生态和系统中,很难找到高效、高并发分析 CDC 这种变动性质的数据。
数据同步任务中断
端到端数据变动
愈来愈慢的近实时报表
没法近实时分析 CDC 数据
Netflix 作 Iceberg 最关键的缘由是想解决 Hive 上云的痛点,痛点主要分为如下三个方面:
通用化标准设计
完善的 Table 语义
丰富的数据管理
性价比
上方为一个标准的 Iceberg 的 TableFormat 结构,核心分为两部分,一部分是 Data,一部分是 Metadata,不管哪部分都是维护在 S3 或者是 HDFS 之上的。
上图为 Iceberg 的写入跟读取的大体流程。
能够看到这里面分三层:
每次写入都会产生一批文件,一个或多个 Manifest,还有快照。
好比第一次造成了快照 Snap-0,第二次造成快照 Snap-1,以此类推。可是在维护原数据的时候,都是增量一步一步作追加维护的。
这样的话能够帮助用户在一个统一的存储上作批量的数据分析,也能够基于存储之上去作快照之间的增量分析,这也是 Iceberg 在流跟批的读写上可以作到一些支持的缘由。
上图为目前在使用 Apache Iceberg 的部分公司,国内的例子你们都较为熟悉,这里大体介绍一下国外公司的使用状况。
苹果有两个团队在使用:
回到最关键的内容,下面阐述 Flink 和 Iceberg 如何解决第一部分所遇到的一系列问题。
首先,同步链路用 Flink,能够保证 exactly once 的语义,看成业出现故障时,可以作严格的恢复,保证数据的一致性。
第二个是 Iceberg,它提供严谨的 ACID 语义,能够帮用户轻松隔离写入对分析任务的不利影响。
如上所示,当发生数据变动时,用 Flink 和 Iceberg 能够解决这个问题。
Flink 能够捕捉到上游 Schema 变动的事件,而后把这个事件同步到下游,同步以后下游的 Flink 直接把数据往下转发,转发以后到存储,Iceberg 能够瞬间把 Schema 给变动掉。
当作 Schema 这种 DDL 的时候,Iceberg 直接维护了多个版本的 Schema,而后老的数据源彻底不动,新的数据写新的 Schema,实现一键 Schema 隔离。
另一个例子是分区变动的问题,Iceberg 作法如上图所示。
以前按 “月” 作分区(上方黄色数据块),若是但愿改为按 “天” 作分区,能够直接一键把 Partition 变动,原来的数据不变,新的数据所有按 “天” 进行分区,语义作到 ACID 隔离。
第三个问题是小文件对 Metastore 形成的压力。
首先对于 Metastore 而言,Iceberg 是把原数据统一存到文件系统里,而后用 metadata 的方式维护。整个过程实际上是去掉了中心化的 Metastore,只依赖文件系统扩展,因此扩展性较好。
另外一个问题是小文件愈来愈多,致使数据扫描会愈来愈慢。在这个问题上,Flink 和 Iceberg 提供了一系列解决方案:
第二个问题是在同步过程当中,如何保证 Binlog 一行很多地同步到湖中, 即便中间碰到异常。
对于这个问题,Flink 在 Engine 层面可以很好地识别不一样类型的事件,而后借助 Flink 的 exactly once 的语义,即便碰到故障,它也能自动作恢复跟处理。
第三个问题是搭建整条链路须要作很多代码开发,门槛过高。
在用了 Flink 和 Data Lake 方案后,只须要写一个 source 表和 sink 表,而后一条 INSERT INTO,整个链路就能够打通,无需写任何业务代码。
上图为 Iceberg 的 Roadmap,能够看到 Iceberg 在 2019 年只发了一个版本, 却在 2020 年直接发了三个版本,并在 0.9.0 版本就成为顶级项目。
上图为 Flink 与 Iceberg 的 Roadmap,能够分为 4 个阶段。
本文内容由阿里云实名注册用户自发贡献,版权归原做者全部,阿里云开发者社区不拥有其著做权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。若是您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将马上删除涉嫌侵权内容。