一个近期由Hudi PMC & Uber Senior Engineering Manager Nishith Agarwal分享的Talk
关于Nishith Agarwal更详细的介绍,主要从事数据方面的工作,包括摄取标准化,数据湖原语等。
什么是数据湖?数据湖是一个集中式的存储,允许以任意规模存储结构化和非结构化数据。你可以存储原始数据,而不需要先转化为结构化的数据,基于数据湖之上可以运行多种类型的分析,如dashboard、大数据处理的可视化、实时分析、机器学习等。
接着看看对于构建PB级数据湖有哪些关键的要求
第一个要求:增量摄取(CDC)
企业中高价值的数据往往存储在OLTP中,例如下图中,users表包含用户ID,国家/地区,修改时间和其他详细信息,但OLTP系统并未针对大批量分析进行优化,因此可能需要引入数据湖。同时一些企业采用备份在线数据库的方式,并将其存储到数据湖中的方法来摄取数据,但这种方式无法扩展,同时它给上游数据库增加了沉重的负担,也导致数据重写的浪费,因此需要一种增量摄取数据的方法。
第二个要求:Log Event去重
考虑分析大规模时间序列数据的场景,这些事件被写入数据管道,并且数量非常大,可达数十亿,每秒可达百万的量。但流中可能有重复项,可能是由于至少一次(atleast-once)保证,数据管道或客户端失败重试处理等发送了重复的事件,如果不对日志流进行重复处理,则对这些数据集进行的分析会有正确性问题。下图是一个示例日志事件流,其中事件ID为唯一键,带有事件时间和其他有效负载。
第三个要求:存储管理(自动管理DFS上文件)
我们已经了解了如何摄取数据,那么如何管理数据的存储以扩展整个生态系统呢?其中小文件是个大问题,它们会导致查询引擎的开销并增加文件系统元数据的压力。而如果写入较大的文件,则可能导致摄取延迟增加。一种常见的策略是先摄取小文件,然后再进行合并,这种方法没有标准,并且在某些情况下是非原子行为,会导致一致性问题。无论如何,当我们写小文件并且在合并这些文件之前,查询性能都会受到影响。
第四个要求:事务写(ACID能力)
传统数据湖在数据写入时的事务性方面做得不太好,但随着越来越多的业务关键处理流程移至数据湖,情况也在发生变化,我们需要一种机制来原子地发布一批数据,即仅保存有效数据,部分失败必须回滚而不会损坏已有数据集。同时查询的结果必须是可重复的,查询端看不到任何部分提取的数据,任何提交的数据都必须可靠地写