内容简要:
一、数据湖介绍
二、数据湖架构与技术探索
三、阿里云云原生数据湖实践
一、数据湖介绍
(一)什么是数据湖?
数字化趋势下,许多企业通过利用数据的价值达到业务上的提升,数据量爆炸性增长使得源头越来越丰富,例如数据库数据、APP日志、服务器日志、LT数据。
在这种背景下,需要更好的数据架构支撑,且能够更灵活的支撑上层各种各样场景的分析,与数据库相关的有:
HDFS/OSS/S3数据存储类组件;
阿里云OSS对象存储;
Delta Lake数据库格式;
Hudi/Iceberg数据库组件;
湖仓一体的DataWarehouse/LakeHouse。
什么是数据湖?
如下图所示:
中间是存储,底层数据通过实时或离线的方式进入数据库中,上层在数据库中做分析或学习,这是比较简单的Pipeline。
阿里云数据库云上流程如下图所示:
数据的流入有许多产品支持,主要围绕OSS对象存储。数据流入后,支持数据分析和服务,包括对流入的数据做数据治理、安全权限。
上图为Delta Lake网站上数据湖的一种场景。
通过流式或者批式的方式导入到数据湖上,数据湖底层的存储如HDFS、S3、Azure Data Lake Storage对象存储,上层是数据库格式,提供更丰富的场景支撑能力。
上图为另外一个数据库格式下,Hudi网站上一个Pipeline图。它有很多数据源,通过Hudi的工具,将数据写到Hudi格式里面。 Hudi格式底层是一些分布式存储或者对象存储,还有Alluxio加速。
目前数据湖的定义存在些许差别。
如Wikipedia对数据湖的定义是原始数据的存储,支持后续分析和学习,存储结构化数据和非结构化数据,可以构建在线下的机房里面,也可以在云上构建数据库。
AWS对数据湖的定义是一个中心化的存储,存储结构化数据和非结构化数据,可以做各种各样的分析。
微软对数据湖的定义是提供许多相关的产品与工具,让开发者或者数据科学家能够存储各种各样的数据类型,提供各种各样分析的能力或平台。
概括来说,数据库是:
·一个中心化的存储,接入不同数据源,可以存储半结构化、结构化和非结构化的数据。
·存储偏原始的数据,可以支撑上层各种各样的分析。
Keywords:
·Centralized repository;
·Streaming&batch ingest;
·Semi-structured/unstructured/structured;
·Data as-is/raw data;
·Support different types of analytics.
数据湖偏原始的数据,数据入库的时候不需要做建模,数据仓库需要提前做各种建模,管理与定义Schema,然后数据才能进来。数据湖是数据先进来,分析的时候抓取Schema,再去做分析。数据仓库是结构化的数据。
数据湖类型比较丰富,是开放的存储。上层可以对接分析引擎,例如可以机器学习、查询,或者在数据湖基础上构建一个数仓。数据湖较为开放、灵活。对比之下,数据仓库较为封闭。存储与引擎为一体,存储在引擎下面,做优化时需要结合引擎。
数据仓库导入过程会对文件做优化或索引,对数据质量由Schema保证,上层的数据治理权限较为完善。数据湖灵活、开放,但在数据治理、安全上有隐患,导入时可能存在小文件的问题。
现在数据仓库向湖仓一体方向发展,结合数据湖的灵活性和开放性,以及数据仓库的数据治理与安全,导入的数据质量,整套的体系较为完善。
数据湖体系里面,各自有不同的位置,HDFS/OSS/S3是数据湖存储,Delta Lake/Hudi/Iceberg是数据库格式,DataWarehouse/LakeHouse数据湖上层应用场景。
(二)为什么要用数据湖?
企业做数字化转型,需要从不同的角度与地点采集数据,将爆炸性增长的数据挖掘与利用。
数据源和数据类型越来越多,如LT相关的数据,业务数据库相关的数据等。数据湖暂时无规划的数据,等有需要的时候再将数据做分析处理,导入到数据仓里做后续查询。数据湖有非常灵活的特性,能够支撑上层分析场景,丰富的数据可以用于支持后续的分析与架构。
(三)数据湖问题与挑战
根据公开媒体报道,数据湖建设失败的案例不在少数。
不经考虑、未加管理、毫无条理的数据存储不能给数据分析带来任何帮助,如果缺少必要的数据管理、元数据获取、质量管理、安全管理能力和过程,或是未能正确围绕一个业务中心正确开展,数据湖终将变成无用的数据沼泽。
基于上图的结构,分析数据湖在实践中会遇到哪些问题:
Ø 数据摄入(入湖)
·数据源太多,入湖开发成本高;
·数据质量无法保障(脏数据、重复数据、Schema缺少……);
·要求实时入湖做分析时,中间数据可能分出现问题。
Ø 数据存储
·数据量增长,需要考虑成本、扩展性、性能的问题。
Ø 数据管理分析
·缺乏元数据管理、发现,分析困难;
·性能与安全上没有保障。
二、数据湖架构与技术探索
(一)数据库架构
如上图所示,数据库架构Pipeline分为很多层。
原始是数据源,其次是摄入层,指数据入湖包括实时与成批的导入。第三层是存储层,支撑后续不同场景的计算。接着是应用层,横向向后是数据治理,包括运维的数据质量等。在这个架构下,能够更好的挖掘数据库的数据价值,并发挥出其价值。
(二)数据摄⼊/⼊湖
数据摄入(入湖)需要解决的问题,总结如下:
Ø 数据源很多,同步/ETL开发成本;
Ø 如何避免数据沼泽,提高数据质量/可用性;
Ø 提供数据更新订正能力,Schema演化;
Ø 如何保证链路上的Exactly Once;
Ø 实时入湖读写如何隔离,防止脏读。
如何去解决数据摄⼊(⼊湖)的问题,下面以某个产品为例:
对于解决数据源很多,同步/ETL开发成本的问题,整体上通过拖拽或者配置的方式,拖拽数据源进行配置,构建Pipeline。或者通过常用数据源/ETL算子进行配置的方式构建Pipeline。定义ETL算子在相关场景下是可以复用的,通过数据源把它抽象到产品中。对于典型的实时数仓(数据库Binlog同步),链路上还是有很多工作。
数据摄入/入湖还需要解决以下几个问题:
1)避免数据沼泽,提高数据质量/可用性;
2)提供数据更新订正能力, Schema演化;
3)如何保证链路上的Exactly Once;
4)实时⼊湖读写如何隔离,防止脏读。
数据湖整体功能趋向统一,如DELTA LAKE提供数据更新订正能⼒,Scheme演化能力。但是它们各有所长,如Hudi比较擅长的Upset场景,ICEBERG偏向于索引与性能。
DELTA LAKE如何解决Update&Delete&Merge等相关问题?
如下图所示:
底层数据是Parquet格式,可以管理源数据,中间是MetadataManagement,上面支持Transactions。
基于这三层,数据可以通过Streaming实时写入Delta Lake,后续可以用Presto或者Spark实时查询。
这种方式有隔离的特性支撑,相当于有Update&Delete&Merge、演化Schema和查询Time Travel历史上某个时间点数据的能力。
(三)数据湖存储
数据量很大时需要考虑成本(包括运维成本)、扩展、性能,选择不同的存储方式有不同的特点。
HDFS
1)集群规模瓶颈;
2)NameNode压力;
3)规划集群复杂;
4)运维难度大;
5)成本高;
6)性能高。
对象存储OSS/Amazon S3
1)按需计费,无限扩容;
2)存算分离,规划简单;
3)运维简单;
4)性能需优化(带宽/元数据操作)。
(四)数据湖分析
数据湖如何支撑上层的多场景多引擎高性能挖掘数据价值。
总结如下:
Ø 统一元数据管理/发现;
Ø 引擎深度优化;
Ø 多种接口多语言访问支持(posix/filesystem/c++/java/…);
Ø 企业级安全(认证/权限/…)。
三、阿里云云原生数据湖实践
如上图所示,阿里云云原生数据湖架构由多个部分组成。
首先数据源里有日志数据、数据库数据。数据源通过数据库构建产品,管理数据库的语言数据、访问控制、表或列的权限等,提供入湖解决方案,包括数据湖元数据、访问控制、入湖工具,构建入湖的Pipeline。
数据湖存储是围绕对象存储OSS,支持Delta Lake、Hudi、Iceberg等数据库格式,能够解决数据标准、低频、归档等数据湖上面的问题。
在这个基础上,为了支撑上层的引擎分析、数据挖掘,提供了JindoFS。JindoFS是能够把大数据体系结合起来的中间层。能够封装的标准的API,使上层的Spark、Presto能够对接上OSS数据。
再往上是云原生计算引擎,如EMS基本上都是开源的组件。最上层为数据开发治理,用户做数据开发治理的平台。
(五)数据湖构建/DLF
数据库构建(DLF)主要功能是横向的基础设施,解决数据库的管理。
功能包括:
Ø 数据入湖
支持多种数据源一键入湖模板;
支持Delta/Hudi/Parqute等格式;
支持实时入湖(CDC\KAFKA\SLS\…)。
Ø 元数据服务
兼容开源生态API;
自动爬取Schema;
多引擎对接(Spark/Hive/MC/Holo/…)。
Ø 权限管理
支持表/列权限控制;
支持OSS权限托管。
下面是数据入湖内核上做的工作。
从架构来看,底层是Delta Lake、OSS、Hudi、HDFS,上面是Spark、Presto等引擎。对Delta/Hudi做了性能优化和功能的增强,如自动的小文件合并,SparkSQL和Spark Streaming SQL深度集成,让用户能够用SQL的方式写Pipeline,降低开发门槛,查询引擎优化,OSS Rename原子性。
如上图所示,Spark Streaming SQL是官方文档,可以像写离线SQL那样去写流失的作业的这种SQL,功能包括动态分区表等。
(六)数据湖存储/JindoFS
JindoFS是在OSS和引擎之间把大数据串起来的一个组件,它同时做了性能优化。
阿里云OSS SDK 是对象存储接口,本身并不能直接用于 Hadoop/Spark
• 类似于 AWS 的 EMRFS,Hadoop 社区的 S3A FS
• 对 OSS 访问支持 RAM/AK 免密,支持 Credentials Provider
• 和 Hadoop 社区版本相比:
o 核⼼代码Native 优化,各种基本操作大幅性能提升(> 60%)
o 大目录Listing操作,快1X
o 大目录Rename操作,快3X
o 支持无需Rename的Job Committer
• 提供Cache模式/Block模式
• 提供 POSIX/FUSE 支持
• 提供 TensorFlow FileSystem Connector
• 提供 Python SDK
• 在大文件/小文件训练数据测试上,具有显著性能优势
• 支持多种选项:默认无缓存、元数据缓存和数据缓存
• 针对训练材料Batch大文件和大量小文件分别优化
• 支持命令式预加载、周期性自动加载到缓存,加速后续训练
• 支持转储加载结构化半结构化数据到缓存,加速后续训练
(七)数据湖分析
数据湖分析主要是DLF统一元数据/权限,做中间横向的基础设施,打通数据库的数据与上层引擎。