数据湖是一种不断演进中、可扩展的大数据存储、处理、分析的基础设施;以数据为导向,实现任意来源、任意速度、任意规模、任意类型数据的全量获取、全量存储、多模式处理与全生命周期管理;并通过与各类外部异构数据源的交互集成,支持各类企业级应用。
目前在生产上可以用的经验不多,笔者个人在调研技术方案时参考了目前市面上公开的众多资料,供团队在数据架构设计和选型上进行参考。
华为生产场景数据湖平台建设实践
该平台围绕数据分如下三大逻辑模块:
典型数据应用场景按应用场景,对数据流程、处理平台进行的标注:
- (绿色)结构化数据通过批处理、虚拟镜像到Hive数据,再通过Kylin预处理将数据储存在Cube中,封装成RESTAPI服务,提供高并发亚秒级查询服务,监测物料质量情况;
- (红色)IoT数据,通过sensor采集上报到MQS,走storm实时分拣到HBase,通过算法模型加工后进行ICT物料预警监测;
- (黄色)条码数据通过ETLloader到IQ列式数据湖,经过清洗加工后,提供千亿规模条码扫描操作。
非结构化质检图片数据:
通过web前台、数据API服务,进行图片数据的上传及查询,图片需要有唯一ID作为标示,确保可检索。海量图片数据以ID为rowkey,储存于Hbase平台,提供快速储存及查询能力。数据资产上有以下方面的构建:
- 统一索引描述非结构数据,方便数据检索分析。
- 增加维护及更新时间作为对象描述字段(图片类型、像素大小、尺寸规格)。非对象方式及数字化属性编目(全文文本、图像、声音、影视、超媒体等信息),自定义元数据。
- 不同类型的数据可以形成了关联并处理非结构化数据。
实时金融数据湖的应用
在功能上,包括数据源、统一的数据接入、数据存储、数据开发、数据服务和数据应用。
- 第一,数据源。不仅仅支持结构化数据,也支持半结构化数据和非结构化数据。
- 第二,统一数据接入。数据通过统一数据接入平台,按数据的不同类型进行智能的数据接入。
- 第三,数据存储。包括数据仓库和数据湖,实现冷热温智能数据分布。
- 第四,数据开发。包括任务开发,任务调度,监控运维,可视化编程。
- 第五,数据服务。包括交互式查询,数据 API,SQL 质量评估,元数据管理,血缘管理。
- 第六,数据应用。包括数字化营销,数字化风控,数据化运营,客户画像。
在逻辑上,实时金融数据湖的逻辑架构主要有 4 层,包括存储层、计算层、服务层和产品层。
- 在存储层,有 MPP 数据仓库和基于 OSS/HDFS 的数据湖,可以实现智能存储管理。
- 在计算层,实现统一的元数据服务。
- 在服务层,有联邦数据计算和数据服务 API 两种方式。其中,联邦数据计算服务是一个联邦查询引擎,可以实现数据跨库查询,它依赖的就是统一元数据服务,查询的是数据仓库和数据湖中的数据。
- 在产品层,提供智能服务:包 RPA、证照识别、语言分析、客户画像、智能推荐。商业分析服务:包括自助分析、客户洞察、可视化。数据开发服务:包括数据开发平台,自动化治理。
整个实时场景架构:
数据源被实时接入到 Kafka 之后,Flink 可以实时处理 Kafka 的数据,并将处理的结果写入到数据湖中。数据湖整体基于开源方案搭建,数据的存储是用的 HDFS 和 S3,表格式用的是 Iceberg。Flink 读取完 Kafka 的数据之后进行实时处理,这时候可以把处理的中间结果写入到数据湖中,然后再进行逐步处理,最终得到业务想要的结果。处理的结果可以通过查询引擎对接应用,包括 Flink、Spark、Presto 等。
Soul的Delta Lake数据湖应用实践
数据由各端埋点上报至Kafka,通过Spark任务分钟级以Delta的形式写入HDFS,然后在Hive中自动化创建Delta表的映射表,即可通过Hive MR、Tez、Presto等查询引擎直接进行数据查询及分析。
我们基于Spark,封装了通用化ETL工具,实现了配置化接入,用户无需写代码即可实现源数据到Hive的整体流程接入。并且,为了更加适配业务场景,我们在封装层实现了多种实用功能:
- 实现了类似Iceberg的hidden partition功能,用户可选择某些列做适当变化形成一个新的列,此列可作为分区列,也可作为新增列,使用SparkSql操作。如:有日期列date,那么可以通过 'substr(date,1,4) as year' 生成新列,并可以作为分区。
- 为避免脏数据导致分区出错,实现了对动态分区的正则检测功能,比如:Hive中不支持中文分区,用户可以对动态分区加上'w '的正则检测,分区字段不符合的脏数据则会被过滤。
- 实现自定义事件时间字段功能,用户可选数据中的任意时间字段作为事件时间落入对应分区,避免数据漂移问题。
- 嵌套Json自定义层数解析,我们的日志数据大都为Json格式,其中难免有很多嵌套Json,此功能支持用户选择对嵌套Json的解析层数,嵌套字段也会被以单列的形式落入表中。
- 实现SQL化自定义配置动态分区的功能,解决埋点数据倾斜导致的实时任务性能问题,优化资源使用,此场景后面会详细介绍。