面向Data+AI时代的数据湖创新与优化(附Iceberg案例)
前言
在当今数字化时代,数据和人工智能(AI)的融合已成为推动企业发展和创新的关键力量。数据湖作为一种重要的数据存储和处理架构,在这个背景下扮演着至关重要的角色。然而,随着 AI 技术的迅速发展和应用场景的不断拓展,数据湖也面临着诸多挑战。
为了更好地应对这些挑战,实现数据和 AI 的深度融合,我们需要对数据湖进行优化和创新。Apache Iceberg 作为一种先进的数据湖技术,为我们提供了一个强大的基础。通过对 Iceberg 的深入研究和应用,我们可以更好地管理和处理数据,提高数据的质量和可用性,为 AI 模型的训练和推理提供有力支持。
同时,在 AI 时代,数据的多样性和复杂性不断增加,包括多媒体数据、向量数据、图数据等。如何有效地存储和处理这些数据,使其能够在数据湖中得到充分的利用,是我们需要解决的重要问题。此外,数据湖与 AI 的融合还需要考虑到性能、可扩展性、安全性等诸多因素,以确保系统的稳定和可靠运行。
在接下来的文章中,我们将深入探讨面向 Data + AI 时代的数据湖优化与实践,以腾讯的经验为例,介绍他们在 Apache Iceberg 基础上的创新举措和应用成果。希望这些内容能够为读者提供有益的参考和启示,推动数据湖技术在 AI 时代的不断发展和完善。
面向Data+AI时代的数据湖创新与优化
随着数据量的不断增长和AI技术的广泛应用,数据湖作为一种重要的数据存储和处理架构,正面临着新的挑战和机遇。本文将深入探讨面向Data+AI时代的数据湖优化与实践,以腾讯为例,介绍其在Apache Iceberg基础上的创新举措和应用场景。
数据湖的发展经历了从第一代到第二代的演变,如今正迈向与AI紧密结合的第三代。第一代数据湖以Hadoop、Hive为核心,主要用于离线T+1的大数据存储和查询,但存在分区级重写、集中式元数据管理和存储局限性等问题。第二代数据湖以Iceberg、Hudi、Delta Lake、Paimon等为代表,强调实时或近实时更新能力,支持行级事务更新、分散式元数据管理和云存储,为数据处理带来了更高的灵活性和效率。
随着大模型AI技术的兴起,第三代数据湖应运而生。除了传统的关系型数据,第三代数据湖还将存储多媒体数据、向量数据、图数据等与AI相关的数据。在数据湖上,不仅可以进行实时入湖、基于Spark的查询和ETL作业等data相关的负载,还可以实现数据科学、模型推理训练和向量查询等AI功能。这使得在一套数据平台上,既能支持AI,又能支持data负载,极大地减少了算法开发人员的负担,使整个流程更加顺畅。
然而,在AI时代,数据湖面临着一些挑战。首先,AI数据管理困难,数据散布在不同的文件格式中,需要ETL串联,时效性差;数据修改和模式变更困难,数据版本难以管理,尤其是跨系统的一致性难以保证。其次,AI数据读写性能较差,不同文件格式的重复序列化/反序列化和不同存储介质的重复I/O导致效率低下。
为了解决这些问题,一些数据湖的创业公司和学术界开始进行前沿探索。例如,LanceDB率先提出了向量数据湖的概念,可存储向量数据和多媒体数据;DeepLake具有好用的可视化界面和版本管理功能;LakeSoul提供了原生的Python接口,方便与模型训练挂钩。学术界也对AI数据管理高度重视,阿里云、微软亚研院和苹果等大公司在相关技术方面进行了探索,如向量数据库的崛起和Batch向量查询优化等。
Apache Iceberg是一款具有重要影响力的数据湖技术,其基础结构包括Catalog层、Metadata层和Data层。Catalog层存储table与metadata location的映射关系,并提供原子更新能力;Metadata层由metadata file、manifest list和manifest file组成,用于存储表的历史快照信息和过滤数据文件;Data层存储表的底层数据和可选的Delete File。
Iceberg支持数据更新,采用Copy-on-Write和Merge-on-Read两种方式。Copy-on-Write是读优化操作,通过重写数据文件来更新数据;Merge-on-Read是写优化操作,通过记录删除信息在读取时进行合并。由于Data files默认采取parquet列存且immutable,这影响了索引的设计。
Iceberg具有很强的开放性,支持多引擎和多语言。其Table Spec采用标准规范化格式,社区实现了多套引擎包,如Spark、Flink等,还支持Python、Java、Rust等多语言API。特别是Iceberg提供的Python接口,为结合AI工作流提供了很大帮助,解决了传统Spark引擎中PySpark模式存在的序列化开销和调试困难等问题。
腾讯基于PyIceberg进行了AI训练和推理链路的实践。PyIceberg API使用简便,通过加载catalog、进行planning和执行等步骤,可将数据转换为所需格式,如pandas、arrow、ray等,还研发了一些API,如将Iceberg转成PyTorch或TensorFlow dataset,以及开发PyIceberg SQL子系统,实现SQL解析和自动Plan优化,提高了算法调试的效率和便捷性。
在AI训练的Data Loader实现方面,社区版默认的bulk load形式在处理大规模数据时容易发生OOM,且GPU资源浪费严重。腾讯开发的支持AI大数据集的DataLoader,采用streaming方式分段加载,对外暴露为iterator形式,针对训练和推理场景进行了优化,如利用Alluxio缓存热数据和进行shuffle操作,提高了数据加载速度和GPU利用率,缩短了数据链路准备时间,改善了开发体验。
在向量查询方面,向量是AI技术中非常重要的概念,将NLP和图像等非结构化数据转化为结构化数组后,可通过数据库方法进行处理。常见的向量查询包括Search和SimJoin,暴力搜索的复杂度较高。为解决此问题,向量数据库采用近似索引技术,如基于聚类的索引和基于图的索引,但这些索引与数据湖的设计思想存在冲突,如难以支持实时入湖、与serverless概念不匹配等。
腾讯采用基于哈希函数的向量索引技术LSH(Locality Sensitive Hashing),其设计目标与普通哈希函数相反,最大化碰撞,使相似向量映射到同一个哈希桶,提高搜索效率。腾讯引入Iceberg向量表的优化,通过自定义数据类型tensor指定向量维度和哈希函数,设定bucket数量并使用Iceberg作为存储,在数据插入时构建LSH索引,实现了增量索引构建、支持实时更新和近似SimJoin,降低了查询复杂度。
在Iceberg向量表实现过程中,腾讯遇到了一些问题,如真实环境下AI数据集存在稀疏向量和数据倾斜。为解决这些问题,腾讯实现了兼容稀疏/稠密向量的自适应列存格式,并提供了相应的算子;采用动态拆分倾斜bucket的技术,结合Spark AQE和bucket join,缓解了负载不均衡的问题,提高了SimJoin查询性能,与Spark ML相比具有2 - 3倍的性能提升,同时保证了查询结果的正确性。
面向Data+AI时代的数据湖优化与实践是一个不断创新和发展的过程。腾讯在Apache Iceberg基础上的探索和实践,为解决AI时代数据湖面临的挑战提供了有益的借鉴,推动了数据湖技术的发展和应用,为企业实现数据驱动的决策和创新提供了有力支持。在未来,随着技术的不断进步,数据湖将在Data+AI时代发挥更加重要的作用,为企业带来更多的价值和机遇。
参考:https://mp.weixin.qq.com/s/HwnGaPWscY0BvAek-4bHpQ
如有内容涉及违规侵权,请联系圈主处理,感谢