"本次分享主要探讨了数据湖的初步探索与实践落地,针对早期数据架构在B站(Bilibili)遇到的痛点,如时效性和稳定性问题,提出了Snowflake数据存储理念的应用,并讨论了如何通过架构升级实现增量入湖以提升数据时效性。"
在数据湖的初步探索中,早期数据架构在Bilibili面临了多个挑战。首先是时效性问题,传统的数据传输管道缺乏计算能力,导致数据无法在前端进行清洗,进一步加重了ODS到DW(数据仓库)的负担。此外,MySQL数据库无法实现实时更新,通常采用Datax按天同步数据,时效性不足,难以满足离线和实时之间的需求平衡。尤其是大规模业务表的同步,耗时且不稳定。
稳定性方面,离线作业资源在凌晨集中爆发,导致资源编排压力大,SLA(服务水平协议)低下。DW和ADS(分析数据服务)层的优化困难,离线任务中的数据倾斜和资源OOM(内存溢出)问题频发。作业启动时间晚,报表产出慢,一旦DW层出现问题,整个ADS的报表产出SLA将无法达标。
为了改善这些问题,Bilibili引入了Snowflake数据存储的理念。Snowflake的核心特性包括存储计算分离,使得系统能够从Share-Nothing架构转变为Share-Data架构。其DataStorage组件利用MVCC(多版本并发控制)和LSM(Log-Structured Merge Tree)技术,支持时间旅行功能。在虚拟机(VM)层面,使用SSD和Cache,实现无状态filestealing,提高效率。CloudServices提供了查询优化器、元数据存储、鉴权以及资源和事务管理等功能。
在DataStorage中,通过Append和Upsert操作,解决了仅能追加数据的问题。通过将表拆分为大量不可变文件,并利用元数据实现文件级别的更新,例如CopyonWrite和MergeOnRead模式。元数据存储采用k-vstore,类似于HBase,便于计算剪枝并提供文件级索引。
结合Snowflake的MVCC机制,实现了SnapshotIsolation事务,支持Time-travel,通过类似undo log的方式记录各种操作(Insert、Update、Delete、Merge)。这些特性有助于提升数据处理的时效性。
为了进一步提升时效性,架构升级采用了增量入湖的策略,即支持Append和Upsert的增量写入。这种做法可以显著提高数据的时效性,使得数据分析更加及时,满足业务对实时或近实时数据的需求,从而提升数据的价值和决策效率。