您当前的位置:首页 > 电脑百科 > 数据库 > 百科

新浪微博的实时数据湖建设实践

时间:2021-07-19 11:39:38  来源:  作者:爱生活的码农

一 摘要

Apache Flink是目前大数据领域最流行的流批一体化计算引擎,而数据湖技术也是互联网时代的产物,以Iceberg、Hudi和Delta为代表的数据湖技术应运而生。Iceberg目前已经提供对Apache Flink 1.11.x的集成支持,Flink可以通过DataStream API/Table API将数据写入Iceberg。

二 背景及痛点

新浪和微博有强大的用户群体,目前积累的数据已经达到几百PB。微博的技术通常会采集应用App的埋点数据以及应用服务日志之类的数据,这些数据通过Kafka消息中间件接入数据仓库。

2.1 数据平台架构

在微博的数据仓库中,有多种大数据存储组件,譬如Hive/HBase/HDFS,计算引擎有MapReduce、Spark、Flink,根据用户不同的需求,会应用不同的技术在大数据平台中计算,将结果保存到MySQL、ES等支持快速查询的关系型、非关系型数据库中,接下来应用层就可以基于这些数据进行BI报表开发、用户画像,或者基于Presto这种OLAP工具进行统计查询。

新浪微博的实时数据湖建设实践

 

2.2 Lambda架构的痛点

在整个数据处理的过程中,我们会借用调用系统来调度应用程序,定期(T+1或者H+1)去执行一些Spark任务。离线数据处理的整个过程中存在着大量的数据延迟现象,这些数据可能是T+1输出或者是H+1输出。但是,业务方已经不再满足于这些离线处理数据的方式,因此,我们也用Flink+Kafka去构建了实时流数据处理系统。

如下图,就是原来使用的Lambda架构,Lambda架构将数仓分成离线层和实时层。也就是说,同一份数据会被处理两次以上,同一套业务逻辑需要适配两次开发。

新浪微博的实时数据湖建设实践

 

例如在实时场景下计算PV、UV时,我们会用实时技术计算,这些数据指标会离开呈现出来。但是,我们有时候需要做趋势分析,需要每天再重新计算一次PV、UV数据,比如在凌晨3点的时候,用Spark在调度系统上把前一天的数据全部重新再跑一遍。

很显然,这两个过程运行的时间不一致,跑的数据却是完全相同的。重新跑一遍离线分析的数据,数据的更新成本很高,更严重的是二者的数据可能不一致(比如有延迟数据产生,离线数据比实时更准确)。

为了解决Lambda架构的痛点,就产生了Kappa架构,相信大家对这个架构也非常熟悉。

2.3 Kappa架构的痛点

Kappa架构解决了Lambda架构中离线和实时数据间不一致、运营和开发成本加班的问题,但是Kappa架构也有痛点。

新浪微博的实时数据湖建设实践

 

首先,我们需要借用Kafka来构建实时场景,但是如果需要对ODS层数据做进一步的分析时,就要接入Flink计算引擎把数据写入到DWD层的Kafka,同样也会将一部分结果数据写入到DWS层的Kafka。但是,如果想做简单的数据分析时,又要将DWD和DWS层的数据写入到ClickHouse、ES、MySQL或者是Hive里做进一步分析,这无疑带来了链路的复杂性。

其次,Kappa架构是严重依赖于消息队列的,我们知道消息队列本身的准确性严格依赖它上游数据的顺序,但是,消息队列越多,发生乱序的可能性越大。通常情况下,ODS层的数据是绝对准确的,把ODS层数据经过计算之后写入到DWD层时就会产生乱序,DWD到DWS更容易产生乱序,这样的数据不一致性问题非常大。

 

那么有没有一种架构,既能满足实时性的需求,又能满足离线计算的需求,同时还能减轻运营开发成本?解决Kappa架构的痛点呢?

2.4 痛点总结

新浪微博的实时数据湖建设实践

 

2.5 实时数据仓库建设需求

是否有一种技术,既能够保证数据高效的回溯能力,支持数据更新,又能够实现数据的流批读写,并且还能够实现分钟级别的数据接入。

这也是建设实时数据仓库的迫切需要,实际上需要对Kappa架构进行改进升级,以解决Kappa架构中遇到的问题,接下来我们会进一步探讨数据湖技术--Iceberg。

新浪微博的实时数据湖建设实践

 

三 数据湖Apache Iceberg介绍

3.1 Iceberg是什么

官网对Iceberg的描述如下:

Apache Iceberg is an open table format for huge analytic datasets. Iceberg adds tables to Trino and Spark that use a high-performance format that works just like a SQL table.

Iceberg的官方定义是一种表格式,可以理解为是基于计算层(Spark、Flink)和存储层(ORC、Parquet、Avro)的中间介质层,用Flink或者Spark将数据写入Iceberg,然后通过Presto、Flink、Spark来读取这些表。

新浪微博的实时数据湖建设实践

 

3.2 Iceberg的Table格式介绍

Iceberg主要是为分析海量数据计算的,被定义为Table Format,Table Format介于计算层和存储层之间。

Table Format向下管理存储系统上的文件,向上为计算层提供接口。比如一张Hive表,在HDFS上会有Partition,存储格式,压缩格式和数据的HDFS目录等,这些信息都维护在元数据中,这些元数据被称为一种文件的组织形式。

Iceberg能够高效支撑上层的计算层访问磁盘上的文件。

3.3 Iceberg的功能总结

Iceberg目前支持三种文件格式,Parquet、ORC、Avro,Iceberg的主要功能如下:

新浪微博的实时数据湖建设实践

 

3.4 Iceberg的设计

3.4.1 设计目标

  • 和HIVE模式类似,它也是一种开放的静态数据存储形式,和计算层使用的语言不同。
  • 具有强大的扩展性和可靠性:简单透明的使用方式,用户只需要关心写入数据的逻辑,Iceberg会自动识别所有元数据的变更。Iceberg也支持并发写。
  • 存储结构高可用:Iceberg有非常合理的Schema管理模式,具有多版本管理机制,支持版本回滚。

3.4.2 详细设计

自带ACID能力:保障每次写入后的数据都是一个完整的快照(snapshot),每个snapshot包含着一系列的文件列表,落地任务把数据直接写入Iceberg表中,不需要任务再做额外的success状态维护。Iceberg会根据分区字段自动处理延时到来的数据,把延时的数据及时的写入到正确的分区,因为有ACID的保障,延时数据写入过程中Iceberg表依然提供可靠的读取能力。

基于MVCC(Multi Version Concurrency Control)的机制,默认读取文件会从最新的的版本,每次写入都会产生一个新的snapshot,读写相互不干扰。

新浪微博的实时数据湖建设实践

 

基于多版本的机制可以可用轻松实现回滚和时间旅行的功能,读取或者回滚任意版本的snapshot数据。

3.4.3 组织架构

下图是 Iceberg 整个文件的组织架构。从上往下看:

  • 最上层是 snapshot 模块。snapshot 是用户可读取的基本数据单位,也就是说,每次读取一张表里面的所有数据,都是一个snapshot 里面的数据。
  • 中间层manifest。一个 snapshot 下面会有多个 manifest,如图 snapshot-0 有两个 manifest,而 snapshot-1 有三个 manifest,每个 manifest 下面会管理一个或多个 DataFiles 文件。
  • 数据层DataFiles。manifest 文件里面存放的就是数据的元信息,我们可以打开 manifest 文件,可以看到里面其实是一行行的 datafiles 文件路径。
新浪微博的实时数据湖建设实践

 

3.5 Iceberg的读写过程介绍

3.5.1 Iceberg的读写

如下图所示,虚线框(snapshot-1)表示正在进行写操作,但是还没有发生commit操作,这时候 snapshot-1 是不可读的,用户只能读取已经 commit 之后的 snapshot。同理, snapshot-2,snapshot-3表示已经可读。

新浪微博的实时数据湖建设实践

 

可以支持并发读,例如可以同时读取S1、S2、S3的快照数据,同时,可以回溯到snapshot-2或者snapshot-3。在snapshot-4 commit完成之后,这时候snapshot-4已经变成实线,就可以读取数据了。

例如,现在current Snapshot 的指针移到S3,用户对一张表的读操作,都是读 current Snapshot 指针所指向的 Snapshot,但不会影响前面的 snapshot 的读操作。

3.5.2 增量读取

Iceberg的每个snapshot都包含前一个snapshot的所有数据,每次都相当于全量读取数据,对于整个链路来说,读取数据的代价是非常高的。

如果我们只想读取当前时刻的增量数据,就可以根据Iceberg中Snapshot的回溯机制来实现,仅读取Snapshot1到Snapshot2的增量数据,也就是下图中的紫色数据部分。

同理,S3也可以只读取红色部分的增量数据,也可以读取S1-S3的增量数据。

Iceberg支持读写分离,也就是说可以支持并发读和增量读。

新浪微博的实时数据湖建设实践

 

3.6 小文件问题

3.6.1 实时小文件问题

目前Flink社区现在已经重构了 Flink 里面的 FlinkIcebergSink,提供了 global committee 的功能,我们采用的也是社区提供的FlinkIcebergSink,曲线框中的这块内容是 FlinkIcebergSink。

多个 IcebergStreamWriter 和一个 IcebergFileCommitter 的情况下,在上游的数据写到 IcebergStreamWriter 的时候,每个 writer 里面做的事情都是去写 datafiles 文件。

新浪微博的实时数据湖建设实践

 

当每个 writer 写完自己当前这一批 datafiles 小文件的时候,就会发送消息给 IcebergFileCommitter,告诉它可以提交了。而 IcebergFileCommitter 收到信息的时,就一次性将 datafiles 的文件提交,进行一次 commit 操作。

commit 操作本身只是对一些原始信息的修改,让其从不可见变成可见。

3.6.2 实时合并小文件

在实际的生产环境中,Flink 实时作业会一直在集群中运行,为了要保证数据的时效性,一般会把 Iceberg commit 操作的时间周期设成 30 秒或者是一分钟。当 Flink 作业跑一天时,如果是一分钟一次 commit,一天需要 1440 个 commit,如果 Flink 作业跑一个月commit 操作会更多。甚至 snapshot commit 的时间间隔越短,生成的 snapshot 的数量会越多。当流式作业运行后,就会生成大量的小文件。

Iceberg 小文件合并是在
org.apache.iceberg.actions.RewriteDataFilesAction 类里面实现的。社区中小文件合并其实是通过 Spark 并行计算的,我们参考了社区Spark的实现方法,自己封装了使用Flink合并小文件的方法。

四 Flink+Iceberg构建实时数仓

4.1 准实时数据仓库分析系统

我们知道Iceberg支持读写分离,又支持并发读、增量读、合并小文件,而且还能做到秒级/分钟级的数据延迟。我们基于Iceberg这些优势,采用Flink+Iceberg的方式构建了流批一体化的实时数据仓库。

新浪微博的实时数据湖建设实践

 

在数据仓库处理层,可以用 presto 进行一些简单的查询,因为 Iceberg 支持 Streaming read,所以在系统的中间层也可以直接接入 Flink,直接在中间层用 Flink 做一些批处理或者流式计算的任务,把中间结果做进一步计算后输出到下游。

4.2 采用Iceberg替代Kafka实时数仓的优劣势

新浪微博的实时数据湖建设实践

 

五 未来规划

5.1Iceberg 内核能力提升

  • Row-level delete 功能。目前社区还不支持行级别的删除功能,Iceberg 当前只支持 copy on write 的 update 的能力。如果要真正的构建一个实时数据仓库,还是需要一个高效的 merge on read 的 update 能力。我们会继续根据社区的更新动态,逐步迭代升级。
  • 建立统一索引加速数据检索。期待社区会有一个完善的统一索引加速功能。

5.2 内部大数据平台升级

希望借助Alluxio构建一个数据湖加速功能,以便在查询层实现秒级分析功能。

建立自动Schema建表的功能。

和所有业务系统打通,年内迁移完成所有业务线的数据,完整全部数据入湖建设。

原创不易,欢迎点赞加关注,您的关注是我持续创作的动力。



Tags:数据湖   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
目前大数据架构已经走向了数据湖时代,无论是单纯的批处理模式,还是同时支持实时和离线数据处理的Lambda架构都已经过时。均不再适应现在大数据的业务发展需要。一 Lambda架构...【详细内容】
2021-07-21  Tags: 数据湖  点击:(84)  评论:(0)  加入收藏
一 摘要Apache Flink是目前大数据领域最流行的流批一体化计算引擎,而数据湖技术也是互联网时代的产物,以Iceberg、Hudi和Delta为代表的数据湖技术应运而生。Iceberg目前已经提...【详细内容】
2021-07-19  Tags: 数据湖  点击:(136)  评论:(0)  加入收藏
四个大型数据和数据湖的大型Apache系统,Apache Shardingsphere,Apache冰山,Apache Hudi和Apache IotdB 管理大数据所需的许多功能是其中一些是事务,数据突变,数据校正,流媒体支持,...【详细内容】
2021-03-09  Tags: 数据湖  点击:(242)  评论:(0)  加入收藏
这几年的数据领域出现好多的概念,例如:人工智能、物联网、边缘计算、数据治理、数据湖、数据中台……可谓是“百花齐放”!一时间大家都在提新概念,但却不是所有人都...【详细内容】
2021-02-25  Tags: 数据湖  点击:(152)  评论:(0)  加入收藏
大数据文摘出品作者:无谓、铁杰、周皓、亦龙、扬清 “数据湖”正在被越来越多人提起,尽管定义并不统一,但企业们都已纷纷下水实践,无论是AWS还是阿里云、华为。 我们认为:数据湖...【详细内容】
2020-09-25  Tags: 数据湖  点击:(125)  评论:(0)  加入收藏
前言从 2018 年起,整个汽车行业处于相对低迷的状态,无论是政策导向或是外资引入的放宽,这些都在无形中加速国内车企的转型步伐。除此之外,互联网新势力不断加码入场、消费者依赖...【详细内容】
2020-08-14  Tags: 数据湖  点击:(82)  评论:(0)  加入收藏
数据作为一项重要资产,已经成为企业的共识,为了更好地存储数据、挖掘数据,企业需要:· 一个超级大的存储库,对数据进行长期的原样的存储;· 能够对这些数据高效地管...【详细内容】
2020-08-10  Tags: 数据湖  点击:(60)  评论:(0)  加入收藏
作者:蒋晓伟(量仔) 阿里云研究员金晓军(仙隐) 阿里云高级技术专家 摘要数据仓库,数据湖,包括Flink社区提的流批一体,它们到底能解决什么问题?今天将由阿里云研究员从解决业务问题出...【详细内容】
2020-06-23  Tags: 数据湖  点击:(141)  评论:(0)  加入收藏
随着5G、AI、IoT等技术越来越普及,企业数据量增大,新的数据业务层出不穷,企业对数据分析的灵活性、性能、成本要求越来越高,基于传统大数据Hadoop系统搭建的数据分析平台已无法...【详细内容】
2020-06-21  Tags: 数据湖  点击:(83)  评论:(0)  加入收藏
▌简易百科推荐
1增1.1【插入单行】insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values (&#39;开心朋朋&#39;,&#39;男&#39;,&#39;1980/6/15&#3...【详细内容】
2021-12-27  快乐火车9d3    Tags:SQL   点击:(1)  评论:(0)  加入收藏
最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫, 不知道各种写法孰优孰劣,该选用哪种写法,以及各种写法的优缺点,本文以一个简单的查询...【详细内容】
2021-12-23  linux上的码农    Tags:sql   点击:(9)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的HasorDB 是一个全功能数据库访问工具,提供对象映射、丰...【详细内容】
2021-12-22  GitHub精选    Tags:HasorDB   点击:(5)  评论:(0)  加入收藏
作者丨Rafal Grzegorczyk译者丨陈骏策划丨孙淑娟【51CTO.com原创稿件】您是否还在手动对数据库执行各种脚本?您是否还在浪费时间去验证数据库脚本的正确性?您是否还需要将...【详细内容】
2021-12-22    51CTO  Tags:Liquibase   点击:(3)  评论:(0)  加入收藏
场景描述:由于生产环境的表比较复杂,字段很多。这里我们做下简化,只为说明今天要聊的问题。有两张表 tab1,tab2: tab1 数据如下: tab2 数据如下: 然后给你看下,我用来统计 name=&#3...【详细内容】
2021-12-20  Bald    Tags:SQL   点击:(5)  评论:(0)  加入收藏
前言知识无底,学海无涯,知识点虽然简单,但是比较多,所以将MySQL的基础写出来,方便自己以后查找,还有就是分享给大家。一、SQL简述1.SQL的概述Structure Query Language(结构化查...【详细内容】
2021-12-16  谣言止于独立思考    Tags:SQL基础   点击:(13)  评论:(0)  加入收藏
前言作为一名测试工程师,工作中在对测试结果进行数据比对的时候,或多或少要和数据库打交道的,要和数据库打交道,那么一些常用的 SQL 查询语法必须要掌握。最近有部分做测试小伙...【详细内容】
2021-12-14  柠檬班软件测试    Tags:SQL   点击:(15)  评论:(0)  加入收藏
话说C是面向内存的编程语言。数据要能存得进去,取得出来,且要考虑效率。不管是顺序存储还是链式存储,其寻址方式总是很重要。顺序存储是连续存储。同质结构的数组通过其索引表...【详细内容】
2021-12-08  小智雅汇    Tags:数据存储   点击:(17)  评论:(0)  加入收藏
概述DBConvert Studio 是一款强大的跨数据库迁移和同步软件,可在不同数据库格式之间转换数据库结构和数据。它将成熟、稳定、久经考验的 DBConvert 和 DBSync 核心与改进的现...【详细内容】
2021-11-17  雪竹聊运维    Tags:数据库   点击:(26)  评论:(0)  加入收藏
一、前言 大家好,我是小诚,《从0到1-全面深刻理解MySQL系列》已经来到第四章,这一章节的主要从一条SQL执行的开始,由浅入深的解析SQL语句由客户端到服务器的完整执行流程,最...【详细内容】
2021-11-09  woaker    Tags:SQL   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条