【实践案例】Databricks 数据洞察 Delta Lake 在基智科技(STEPONE)的应用实践
简介: 获取更详细的 Databricks 数据洞察相关信息,可至产品详情页查看:https://www.aliyun.com/product/bigdata/spark
作者
高爽,基智科技数据中心负责人
尚子钧,数据研发工程师
1、基智科技
北京基智科技有限公司是一家提供智能营销服务的科技公司。公司愿景是基于 AI 和大数据分析为 B2B 企业提供全流程的智能营销服务。公司秉承开放,挑战,专业,创新的价值观从线索挖掘到 AI 智达、CRM 客户管理覆盖客户全生命周期,实现全渠道的营销和数据分析决策,帮助企业高效引流,精准拓客,以更低的成本获取更多的商机。截至目前,基智科技已与包括房产、教育、汽车、企业服务等领域展开广泛合作。
2、背景
在基智科技目前的离线计算任务中,大部分数据源都是来自于业务 DB(MySQL) 。业务 DB 数据接入的准确性、稳定性和及时性,决定着下游整个离线计算 pipeline 的准确性和及时性。最初我们在 ECS 上搭建了自己的 Hadoop 集群,每天使用 Sqoop 同步 MySQL 数据,再经由 Spark ETL 任务,落表写入 Hive ,ES,MongoDB 、MySQL ,通过调用 Service API 做页签的展示。
我们的 ETL 任务一般在凌晨1点开始运行,数据处理阶段约1h, Load 阶段1h+,整体执行时间为2-3h,下图为我们的 ETL 过程:
3、存在的问题
上面的架构在使用的过程中以下几个问题比较突出:
- 随着业务数据的增长,受 DB 性能瓶颈影响突出。
- 需要维护多套数据源,数据冗杂,容易形成数据孤岛使用不方便。
- 天级 ETL 任务耗时久,影响下游依赖的产出时间。
- 数据主要存储在 HDFS 上,随着数据的增加,需要增加集群,成本这一块也是不小的开销。
- 大数据平台运维成本高。
4、选择 Databricks 数据洞察 Delta Lake的原因
为了解决天级 ETL 逐渐尖锐的问题,减少资源成本、提前数据产出,我们决定将T+1级 ETL 任务转换成T+0实时数据入库,在保证数据一致的前提下,做到数据落地即可用。
考虑过使用 Lambda 架构在离线、实时分别维护一份数据但在实际使用过程中无法保证事务性,随着数据量增大查询性能低,操作较复杂维护成本比较高等问题最终没能达到理想化使用。
后来我们决定选择数据湖架构,紧接着考察了市场上主流的数据湖架构:Delta Lake(开源和商业版)& Hudi。二者都支持了 ACID 语义、Upsert、Schema 动态变更、Time Travel 等功能,但也存在差异比如:
Delta Lake 优势:
- 支持 Java 、Scala 、Python 及 SQL。
- 支持作为 source 流式读写,批流操作简捷。
Delta Lake 不足:
- 引擎强绑定 spark 。
- 需要手动合并小文件。
Hudi 优势:
- 基于主键的快速 Upsert / Delete 。
- 支持小文件自动合并。
Hudi 不足:
- 不能支持 SQL 。
- API 较为复杂。
综合以上指标,加上我们之前的平台就是基于阿里云平台搭建,选型时阿里云尚未支持 Hudi ,最终我们选择了阿里云 Databricks 数据洞察(商业版 Delta Lake 专业性更强)。同时 Databricks 数据洞察提供全托管服务,能够免去我们的运维成本。
5、整体架构图

整体的架构如上图所示。我们接入的数据会分为两部分,存量历史数据和实时数据,存量数据使用 Spark 将 MySQL 全量数据导入 Delta Lake 的表中, 实时数据使用 Binlog 采集实时写入到 Delta Lake 表中,这样实时数据和历史数据都同步到同一份表里面真正实现批流一体操作。
集群迁移
前期在阿里同事的协助下我们完成了数据迁移的工作,实现在Databricks数据洞察架构下数据开发工作,我们的前期做的准备如下:
- 数据存储将Hive数仓数据迁移到OSS,数据同步继续使用Sqoop定时执行。
- 元数据管理从自建Hadoop集群迁移到阿里云RDS MySQL,后面随着我们业务的扩展会转入DLF元数据湖管理。
- 大数据分析架构由自建CDH迁移到Databricks数据洞察。

Delta Lake 数据接入
每天做ETL数据清洗,做表的merge操作 ,delta表结构为:
%sql
CREATE TABLE IF NOT EXISTS delta.delta_{table_name}(
id bigint,
uname string,
dom string,
email string,
update timestamp,
created timestamp
)
USING delta
LOCATION '------/delta/'
%sql
MERGE INTO delta.delta_{table_name} AS A
USING (SELECT * FROM rds.table_{table_name} where day= date_format (date_sub (current_date,1), 'yyyy-mm-dd') AS B
ON A.id=B.id
WHEN MATCHED THEN
update set
A.uname=B.name,
A.dom=B.dom,
A.email=B.email,
A.updated=current_timestamp()
WHEN NOT MATCHED
THEN INSERT
(A.uname,A.dom,A.email,A.update,A.created) values (B.name,B.dom,B.email,current_timestamp(),current_timestamp())
6、Delta Lake 数据 Merge & Clones
由于 Delta Lake 的数据仅接入实时数据,对于存量历史数据我们是通过 SparkSQL 一次性 Sink Delta Lake 的表中,这样我们流和批处理时只维护一张 Delta 表,所以我们只在最初对这两部分数据做一次 merge 操作。
同时为了保证数据的高安全,我们使用 Databricks Deep Clone 每天会定时更新来维护一张从表以备用。对于每日新增的数据,使用 Deep Clone 同样只会对新数据 Insert 对需要更新的数据 Update 操作,这样可以大大提高执行效率。
CREATE OR REPLACE TABLE delta.delta_{table_name}_clone
DEEP CLONE delta.delta_{table_name};
7、产生的效益
- 节省了 DB 从库的成本,同时 Databricks 数据洞察全托管架构我们节省了人力成本(省1运维+2名大数据)因此我们采用商业版 Databricks 数据洞察 Delta Lake 流批一体架构之后,整体成本有很大节省。
- 得益于商业版 Databricks 数据洞察 Delta Lake 高效的执行引擎,执行效率上6-10的性能提升。
- 实现了计算和存储分离,同时基于 DLF 元数据湖管理,可扩展性明显提高。
- 商业版 Databricks 数据洞察提供了一整套批流处理的 Spark API 使我们研发工作高效便捷了很多。
8、后续计划
- 基于 Delta Lake ,进一步打造优化实时数仓结构,提升部分业务指标实时性,满足更多更实时的业务需求。
- 持续观察优化 Delta 表查询计算性能,尝试使用 Delta 的更多功能,比如 Z-Ordering ,提升在即席查询及数据分析场景下的性能。
本文为阿里云原创内容,未经允许不得转载。
【实践案例】Databricks 数据洞察 Delta Lake 在基智科技(STEPONE)的应用实践的更多相关文章
- Agora 教程丨一个典型案例,教你如何使用水晶球“数据洞察”
7 月初,声网Agora 水晶球的"数据洞察"功能正式版上线."数据洞察"可显示两种数据,一种是用量,另一种是质量. "数据洞察"的&quo ...
- 《SaltStack技术入门与实践》—— 实践案例 <中小型Web架构>3 Memcached配置管理
实践案例 <中小型Web架构>3 Memcached配置管理 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Memcached介绍 Me ...
- Delta Lake源码分析
目录 Delta Lake源码分析 Delta Lake元数据 snapshot生成 日志提交 冲突检测(并发控制) delete update merge Delta Lake源码分析 Delta ...
- Delta Lake基础操作和原理
目录 Delta Lake 特性 maven依赖 使用aws s3文件系统快速启动 基础表操作 merge操作 delta lake更改现有数据的具体过程 delta表schema 事务日志 delt ...
- Apache Hudi vs Delta Lake:透明TPC-DS Lakehouse性能基准
1. 介绍 最近几周,人们对比较 Hudi.Delta 和 Iceberg 的表现越来越感兴趣. 我们认为社区应该得到更透明和可重复的分析. 我们想就如何执行和呈现这些基准.它们带来什么价值以及我们应 ...
- 实践案例:平安健康的 Dubbo3 迁移历程总结
本篇是 Apache Dubbo 的实践案例.感兴趣的朋友可以访问官网了解更多详情,或搜索关注官方微信公众号 Apache Dubbo 跟进最新动态. 1 背景 我们公司从15年开始就使⽤dubbo作 ...
- 实践案例:同程艺龙网的 Dubbo 升级经验总结
本篇为同程艺龙旅行网 Apache Dubbo 的实践案例总结.感兴趣的朋友可以访问官网了解更多详情,或搜索关注官方微信公众号 Apache Dubbo 跟进最新动态. 作者信息: 严浩:同程艺龙高级 ...
- T-SQL使用案例——结果数据前面自动补0
原文:T-SQL使用案例--结果数据前面自动补0 现象: 在开发的过程中,往往需要数字和字符串互转.在转换的过程中,可能需要把1编程00001,这样的格式.实现这种样子是有非常多的方法,本文主要提供一 ...
- DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能
DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能 一.引言 在当前的电子商务平台中,用户下完订单之后,然后店家会在后台看到客户下的订单,然后店家可以对客户的订单进行发货操作.此时客户会在自己 ...
- 微服务实战(四):服务发现的可行方案以及实践案例 - DockOne.io
原文:微服务实战(四):服务发现的可行方案以及实践案例 - DockOne.io 这是关于使用微服务架构创建应用系列的第四篇文章.第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点.第二和第三 ...
随机推荐
- idea使用Mybatis Log查看执行的sql语句
参考,欢迎点击原文:https://www.jb51.net/article/195895.htm https://blog.csdn.net/qq2710393/article/details/83 ...
- NJUPT自控第一次积分赛的小总结(一)题目感受
快开学了事情真的好多啊 -_- 忙完积分赛就赶紧要去复习期末了...线代还是依托答辩啥都不懂 先看题目吧,RT,我们队(我)选择的是第一题(仅仅是因为很简单罢啦) 一开始看题目,心想不就调调pid吗, ...
- YAML语法入门
Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. Ansible系列博文直达链接:Ansible入门系列 前言 在学习playboo ...
- 3DCAT v2.1.3新版本发布,这三大功能更新你不容错过!
3DCAT实时渲染云在近期发布了新的公有云v2.1.3的版本,本次主要更新了应用页的三项功能「语音交互设置」.「多点触控」.「音频信号位深」. 小编将对这三项更新进行讲解: 1. 调整语音通讯机制 新 ...
- JavaScript实现防抖与节流
1. 引言 有这么一种场景:某个页面表单按钮设置了点击提交事件,有时因为网络不好,点击后后台服务端很久才返回信息,然而用户因等待许久已经多次点击导致多次发送数据,实际上服务器只需要一次发送的数据即可 ...
- 记录--你敢信?比 setTimeout 还快 80 倍的定时器
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 起因 很多人都知道,setTimeout是有最小延迟时间的,根据MDN 文档 setTimeout:实际延时比设定值更久的原因:最小延迟时 ...
- 记录--微信小程序,uniapp,H5端发送,显示emoji表情
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 小伙伴们,在开发中有没有遇到过发布帖子或者实时聊天需要发送到一些emoji表情的. 但是每当我们直接将emoji表情提交到后台的接口又会报 ...
- 记录--uniapp上如何实现安卓app微信登录功能(操作流程总结)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 uniapp上如何实现安卓app微信登录功能?下面本篇文章给大家分享一下uniapp上实现安卓app微信登录的权限申请.开发的具体操作流程 ...
- KingbaseES 参数设置优先级别
Oracle的参数可以设置system和session级别,当设置了session级别的参数时,会覆盖值system级别. KingbaseES除了该两个级别外,还有database级别.user/r ...
- net.sf.json.JSONObject,将MySQL数据库的数据读出转化为json数据
maven依赖: 1 <dependency> 2 <groupId>net.sf.json-lib</groupId> 3 <artifactId>j ...