当我们回顾数据湖的前世时,数据湖的概念在2010年由James Dixon提出,它打破了传统数据管理的范式,提供了一种新的方式来存储、处理和分析数据。与传统的数据仓库相比,数据湖更加灵活和容易扩展,能够接收各种类型和格式的数据,包括结构化、半结构化和非结构化数据。
数据湖的兴起得益于大数据技术和云计算的发展。Hadoop分布式文件系统(HDFS)等技术为数据湖提供了高可扩展性和容错性。同时,云计算提供了便捷的存储和计算资源,使得构建和管理数据湖变得更加简单和经济。
随着时间的推移,数据湖已经成为组织中存储和管理数据的重要组成部分。它在数据分析和业务决策方面发挥着关键作用。数据湖的优点包括:原始数据的保留,消除数据预定义的需求,支持灵活的数据分析和探索,以及适应不断变化的数据需求。本文探讨如下几个观点。
什么是数据湖?
数据湖有哪些特征?
数据湖为什么需要被管理?
数据湖有哪些开源组件可以被利用?
01
—
什么是数据湖
数据湖最早是由Pentaho的创始人兼CTO, 詹姆斯·迪克森,在2010年10月纽约Hadoop World大会上提出来的。当时Pentaho刚刚发布了Hadoop的第一个版本。在这样的一个大背景下,可以合理的猜测,当时James Dixon提出数据湖的概念,是为了推广自家的Pentaho产品以及Hadoop的。
Pentaho是个BI分析组件。当时的BI分析主要是基于数据集市(Data Mart)的。数据集市的建立需要事先识别出感兴趣的字段、属性,并对数据进行聚合处理。这样BI分析面临两个问题:
(1)只使用一部分属性,这些数据只能回答预先定义好(pre-determined)的问题。
(2)数据被聚合了,最低层级的细节丢失了,能回答的问题被限制了。
而基于Hadoop的BI分析,可以解决这个问题——把所有数据都原样存在Hadoop中,后面需要的时候再来取用。如果说数据集市、数据仓库里面是瓶装的水——它是清洁的、打包好的、摆放整齐方便取用的;那么数据湖里面就是原生态的水——它是未经处理的,原汁原味的。数据湖中的水从源头流入湖中,各种用户都可以来湖里获取、蒸馏提纯这些水(数据)。
维基百科上对数据湖的定义是:数据湖是指一个存储大规模、原始和未经处理的数据的存储系统或存储库。数据湖具有以下特点:不需要预先定义模式,可以容纳多种结构和格式的数据,包括结构化、半结构化和非结构化数据;数据以其原始形式存储,不需要转换或转换为特定格式;支持批处理和实时数据处理,以及各种数据分析和挖掘技术。数据湖的目标是为数据科学家、分析师和业务用户提供一个中心化的数据存储和查询平台,以支持数据驱动的决策和业务需求。
在AWS(亚马逊云计算服务)上,数据湖是一种基于云的数据存储和分析解决方案。AWS提供了一系列服务和工具,用于构建和管理数据湖环境。
AWS数据湖的定义包括以下关键组件:
1、存储层:AWS提供了多个存储服务,如Amazon S3(简单存储服务),用于存储数据湖中的原始数据。Amazon S3是一个高可用性、可扩展性和耐久性的对象存储服务,可以容纳大规模的结构化和非结构化数据。
2、数据提取和转换:AWS Glue是一项托管的ETL(抓取、转换和加载)服务,用于将原始数据提取到数据湖中,并进行转换和数据格式化。它提供了自动化的数据抽取、模式转换和目录定义功能。
3、数据编目和管理:AWS提供了AWS Glue Data Catalog,用于对数据湖中的数据进行编目和管理。Glue Data Catalog可以指定数据表、架构和模式,为查询和分析提供元数据和数据目录功能。
4、数据分析和查询:AWS提供了一系列的分析工具和服务,如Amazon Athena、Amazon Redshift和Amazon EMR,用于在数据湖上进行灵活和高效的数据分析和查询。这些服务支持使用SQL查询语言、大数据处理和机器学习等技术进行数据分析。
通过这些组件和服务,AWS数据湖提供了一个强大的基础设施,用于构建和管理大规模数据湖环境,以支持数据驱动的分析和决策过程。
总体来说,数据湖是一种存储和管理大规模数据的架构和概念。它是一个集中式的存储库,可以容纳各种类型和格式的结构化、半结构化和非结构化数据。与传统的数据仓库相比,数据湖不需要事先定义数据的结构和模式,可以接收任意原始数据,并保留数据的原始形式。数据湖的设计目标是提供灵活性、可伸缩性和高性能,支持批处理和实时数据处理,支持各种数据分析和挖掘任务。通过数据湖,组织可以将数据聚集起来,构建数据资产库,方便数据科学家、分析师和业务人员进行数据探索、发现洞察和进行决策。
02
—
数据湖有哪些特征?
03
—
数据湖的数据为什么需要被管理?
数据湖的数据为什么需要被管理主要从用途来分析说明,主要有以下几个方面的用途。
1、数据分析和洞察:数据湖中的数据可以用于进行各种分析和洞察,帮助组织理解业务状况、识别趋势和模式,并支持决策制定。数据湖可以集成大量的结构化和非结构化数据,包括交易记录、传感器数据、日志文件、社交媒体数据等,为数据科学家、分析师和业务用户提供丰富的数据资源。
2、数据挖掘和机器学习:数据湖中存储的数据可以用于进行数据挖掘和机器学习算法的训练和建模。通过分析和挖掘数据湖中的数据,可以发现隐藏的模式、关联和趋势,并构建预测模型和智能应用。
3、实时数据处理:数据湖可以接收和存储来自各种实时数据源的数据,如传感器数据、流数据和日志数据等。这些实时数据可以被实时处理引擎用于监测、警报和实时决策,支持业务连续性和运维的需要。
4、数据共享和协作:数据湖可以作为一个数据中心,为不同团队和部门共享和协作提供统一的数据资源。通过数据湖,团队可以更轻松地访问、共享和交换数据,促进跨部门的数据协作和集成。
通过以上分析,数据湖的主要用途是用来做数据清洗,加工,数据分析,数据共享和机器学习的训练数据,如果要对这些数据进行以上方面的使用,就必须对数据湖的数据进行管理,管理功能主要包含以下几个方面:
1、数据质量控制:数据湖中的数据来自多个来源,以不同的格式和质量。管理数据湖的数据可以确保数据的质量,包括数据的准确性、完整性、一致性和可靠性。通过数据质量控制,可以提高数据分析和决策的准确性和可靠性。
2、数据发现和访问:数据湖中的数据量庞大且多样化,需要有系统地管理和组织数据,使得用户能够方便地发现和访问所需的数据。数据管理可以通过元数据管理、目录管理等方式来实现,提供数据搜索、标签化、分类、权限控制等功能,提高数据的可发现性和可访问性。
3、数据安全和隐私:数据湖中可能包含敏感信息和个人隐私数据,需要对数据进行保护和安全管理。通过数据管理,可以采取控制措施,如数据加密、身份认证和访问控制,以确保数据的安全性和隐私性,符合相关的安全和隐私法规要求。
4、数据生命周期管理:数据湖的数据会随着时间不断积累和变化,需要进行合理的数据生命周期管理。包括数据的采集、存储、备份、归档和清理等过程,以确保数据的可持续性和高效的数据管理。
综上所述,对数据湖中的数据进行管理可以提高数据质量,方便数据的发现和访问,保护数据的安全和隐私,以及实现数据的生命周期管理。这样可以更好地利用和价值化数据湖中的数据,支持业务决策和创新。
原子性是指一个操作要么全部执行成功,要么全部失败,不会出现部分成功部分失败的情况。在数据湖中进行写入操作的原子性难以保证,意味着在写入数据时,无法保证数据的完全一致性和可靠性。这是因为数据湖是一个存储大量原始、未经加工的数据的存储系统,允许各种各样的数据类型和格式。由于数据湖不对数据应用任何特定的数据模式、结构或约束,因此在进行写入操作时,往往会面临以下挑战:
1、数据冲突:由于数据湖允许多个数据流以并行的方式写入数据,因此可能会出现多个数据流同时修改同一数据的情况,导致数据冲突和不一致性。
2、数据更新:数据湖中的数据是原始、未经加工的,如果需要修改或更新已存在的数据,可能需要执行复杂的操作,并且无法保证所有相关的数据都能被同时更新。
3、数据丢失:在写入数据时,存在数据写入失败或中断的可能性,尤其是在高并发的写入操作中。这可能导致部分数据未能成功写入,从而造成数据丢失。
由于上述挑战,数据湖的写入操作难以实现严格的原子性,因此需要在实现数据湖架构时采取额外的措施来确保数据的一致性和可靠性。
数据湖的管理功能涵盖了以下三个方面:
1、用于支持数据湖的数据使用的功能,例如数据处理功能、数据分析功能、数据共享、数据探索功能
2、用于支持数据湖的数据存储功能,例如数据集成,数据存储
3、用于支持数据湖的数据管理功能,例如元数据管理、数据质量、数据规范、数据安全、数据权限、数据生命周期管理
核心的管理功能:
1、数据质量控制:由于数据湖中的数据来自多个源头,可能存在不同格式、不完整、冗余、错误或低质量的数据。数据湖的管理功能包括数据清洗、转换和标准化等,以确保数据的准确性、一致性和完整性。
2、数据探索:数据湖中存储了大量的数据,如何快速准确地找到所需的数据并进行访问是关键问题。数据湖的管理功能提供元数据管理、数据目录和搜索等功能,帮助用户快速发现、理解和使用数据。
3、数据安全和隐私:数据湖中的数据往往包含敏感信息,如个人身份信息、财务数据等。数据湖的管理功能需要确保数据的安全性和隐私保护,包括访问控制、数据加密、身份认证和审计等措施。
4、数据生命周期管理:数据湖中的数据具有不同的价值和使用期限,需要根据不同的需求进行存储、备份、清理和归档等管理。数据湖的管理功能包括数据存储策略、数据生命周期管理和数据归档等,以确保数据的可用性和成本效益。
5、元数据管理:元数据是描述数据的数据,包括数据的结构、定义、来源等信息。数据湖的管理功能涵盖了元数据的收集、存储、管理和维护,以提供数据的全面描述和理解。
04
—
数据湖的管理的开源组件有哪些?
Hive表作为数据湖存储的确存在一些问题,主要包括以下几点:
1、数据可靠性和一致性:Hive在批量写入数据时,缺乏事务性支持,因此无法保证数据的原子性和一致性。当多个操作同时发生时,可能会导致数据的不一致性。如果同时存在 读-写,写-写 任务时,无法保证任务的一致性,会发生莫名其妙的错误,或刚写入的数据被其它任务覆盖了。
2、数据更新和增量计算:hive表不支持删除,更新表等操作,Hive无法直接进行实时数据更新和增量计算。对于需要频繁更新的数据,Hive需要执行全量写操作,并覆盖已有数据,导致性能低下。
3、元数据管理:Hive的元数据管理机制相对简单,对于数据的版本管理和回溯能力有限。Hive 表的 schema 集中存储在 metastore 中,metastore 很容易成为性能瓶颈,同时也会带来分库分表等运维成本。
4、Hive表下的HDFS数据查询非常慢:现在的计算引擎(Presto Spark)都是分布式执行的,以 Spark 为例,假如某个表有 100 个数据文件,执行时一共有 10 个 Executor,在 Exector 执行前,Driver 会对数据文件进行切分,最终每个 Executor 可能分配 10 个数据文件。由于 Hive 表格式只保存了数据文件的目录,所以在文件切分前会使用文件系统的 list 操作,列出所有的数据文件。list 操作存在以下问题:HDFS 文件系统下,如果频繁大量的调用 list 操作会给 NameNode 的 RPC 带来压力;如果文件数过多,list 会比较耗时,曾经就遇到一个这样的例子,由于一个表使用了二级分区,生成了大量的分区和文件,在执行全表扫描的时候,仅仅是文件切分就花了10 分钟。
对象存储下 list 操作非常慢。如果将HDFS文件系统替换成分布式存储的文件系统,由于 Hive 表格式只保存了数据文件的目录,所以在 Executor 执行时,先把计算结果写入临时目录,等待 Executor 全部执行完成后,Driver 端会把临时文件目录 rename 到正式的文件目录,此操作依赖文件系统的 rename 操作。在对象存储中 rename 操作非常慢。
为了解决以上四个问题,于是产生了数据湖的管理组件:Iceberg、Hudi和Delta Lake。
以下是三款数据湖产品的功能对比:
对比项 | DeltaLake | Apache Hudi | Apache Iceberge |
update/delete | 支持 | 支持 | 支持 |
文件合并 | 人工支持 | 自动 | 人工支持 |
历史数据清理 | 自动 | 自动 | 人工支持 |
文件格式 | parquet | parquet\avro | parquet\avro\orc |
计算引擎 | hive\spark\presto | hive\spark\presto\flink | hive\spark\presto\flink |
存储引擎 | HDFS\S3\Azure | HDFS\S3\Azure\OBS\ALLUXIO | HDFS\S3 |
SQL DML | 支持 | 支持 | 支持 |
ACID 事务性 | 支持 | 支持 | 支持 |
TimeLine | 支持 | 支持 | 支持 |
索引 | 不支持 | 支持 | 不支持 |
可以扩展的元数据存储 | 支持 | 支持 | 支持 |
schema的约束和演化 | 支持 | 支持 | 支持 |
现在来看一下Iceberg、Hudi和Delta Lake是如何解决这些问题的,并且它们的侧重点有何不同:
Iceberg: 定位于高性能的分析与可靠的数据管理。它引入了事务性支持和多版本管理机制,通过支持原子更新操作和管理多个数据版本,确保数据湖中的数据可靠、一致,并提供了强大的数据版本回溯和查询功能。Iceberg 通过文件组织设计也能达到数据更新效果,但是每一次的 commit 都会产生新的文件,如果写入/更新频繁,小文件问题会比较严重。
Hudi:Hudi主要解决数据湖中实时数据更新和增量计算的问题。Hudi 凭借文件组+索引+主键的设计模式,能够有效减少数据文件的冗余更新,提高数据更新效率。Hudi支持索引以提高查询性能。
Delta Lake:旨在于流批一体的数据处理。主要是通过spark引擎进行数据更新操作,它通过实现ACID事务性支持和管理元数据,解决了Hive的批量写入不具备事务性和元数据管理能力的问题。Delta Lake还提供了灵活的数据版本控制和数据一致性保证。
尽管Iceberg、Hudi和Delta Lake都致力于解决Hive作为数据湖存储存在的问题,但它们的侧重点略有不同。
三个组件各自的优势:
1、Iceberg:
支持低延迟的读取和高效的增量写入,适用于对查询性能要求较高的场景。
提供了强大的事务性保证,支持ACID操作和并发写操作。
提供了高度可靠的元数据管理,可以跟踪和管理数据集的更改历史。
支持表分区和数据分层,可以提高查询性能和降低存储成本。
支持数据的增量更新和删除操作。
提供了类似于数据库的写操作接口,可以实现事务一致性。随着数据不断写入,会有小文件产生。对于这些小文件,可以自动地触发小文件合并的任务。
在查询方面,Hudi 支持 Hive、Spark、Presto。支持索引。Hudi 的另一大特色是支持 Copy On Write 和 Merge On Read。前者在写入时做数据的 merge,写入性能略差,但是读性能更高一些。后者读的时候做 merge,读性能查,但是写入数据会比较及时,因而后者可以提供近实时的数据分析能力。
支持 update/delete/merge。由于出自 Databricks,spark 的所有数据写入方式,包括基于 dataframe 的批式、流式,以及 SQL 的 Insert、Insert Overwrite 等都是支持的。但是delta的增量跟新和写入都和Spark强绑定。
在查询方面,开源 Delta 目前支持 Spark 与 Presto,但是查询需要和spark进行强绑定。Delta 在数据 merge 方面性能不如 Hudi,在查询方面性能不如 Iceberg,但是delta 和spark 引擎结合的很好。
本文系转载,版权归原作者所有,
转载自公众号 xxxx ,如若侵权请联系我们进行删除!
《行业指标体系白皮书》下载地址:https://www.dtstack.com/resources/1057/?src=bbs
《数据治理行业实践白皮书》下载地址:https://www.dtstack.com/resources/1001/?src=bbs
《数栈V6.0产品白皮书》下载地址:https://www.dtstack.com/resources/1004/?src=bbs
想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs
同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:https://github.com/DTStack