一篇在Bangalore Hadoop Meetup上分享的使用Apache Hudi和Debezium构建CDC管道,分享者是Apache Hudi社区活跃贡献者Pratyaksh。
CDC(CHANGE DATA CAPTURE):是一种软件设计模式,用于确定和跟踪已变更的数据,以便可以对更改后的数据采取措施,一个简单的示例是捕获MySQL变更的记录,然后导入数据湖。
业务部门要求获取业务洞察力;服务所有者随着时间的推移要求验证记录的每个版本,数据工程师要求建立维护成本低的管道以从事务处理系统(MySQL, Postgres,Cassandra,Mongo)到分析系统(HDFS)CDC具有低延迟。CDC具有如下优势,事件处理,实时分析和展示板,审计日志,24小时负载工作。
对于CDC有不同的方案,如基于日志的Debezium和基于查询的JDBC Connector,如Sqoop,大多数公司在使用Sqoop来处理数据,处理数据源的模式变更并处理文件存储格式,但很难处理CSV等格式。
在过去,考虑到必须放弃开放性和社区支持,我们因此使用了Maxwell。
只要避免高频流处理,NiFi是一个很好的数据流工具,它具有很高的IO,因此磁盘可能成为瓶颈并且没有数据冗余,所以应该配置AWS EBS,此外,我们还必须给CatpureChangeMySql处理器打patch以便处理内存缓冲。
Debezium是一个得到了redhat支持的活跃项目。它基于KafkaConnect构建,并支持SQL和NOSQL数据库,它通过合并SQL info模式和Alter语句来更新已缓存的模式。
Bootstrap:由于binlog/WAL不会保留太久,因此是在首次启动时会处理整个数据库快照。
Databricks最近开源的Delta.io(前不久才支持Presto和Authena。Uber开源Apache hudi,存储格式只具有重写拆分功能(Athena)的parquet文件输入格式。Parquet格式-看起来有争议-但Spark社区(DS)的文件格式演变更好。Hive–尽管获得LLAP支持,但感觉仍然很慢(MR,TEZ)
系统整体架构如下,数据库可以是SQL或NOSQL,BinLog和WAL。整个服务运行在Kubernetes上,我们构建了抽象层来支持Debezium的NRT需求–因为新鲜度总是伴随着更高的成本。Batch和DB的JDBC,但不支持获取变更日志。
Hudi代表Hadoop的更新,删除和增量。也就是说,hudi提供了一个有效的平台来进行数据提取,协调和查询。对于数据提取和协调,它会保留hudi键。
- 重复数据删除,同一记录的多次更新需要转到同一分区路径。Hudi使用索引。(bloom或hbase)。
- 如果存在,则标记记录的当前位置 并传入记录。
- 写入时,会保持最小的hdfs文件大小,这也是在hudi中解决小文件问题的方式。
- COW模式下,可以使用清理策略来清理所有过时的数据
- 对于查询,支持多个视图–读优化视图,实时视图和增量视图。
- COW支持读优化视图和增量视图。
- MOR支持所有这三种视图。
下面是Apache Hudi的系统架构,使用Spark微批读取数据,并支持索引,可将表同步支持Hive Metasore中,同时对于查询支持三种视图。
使用Hudi时也存在如下挑战
对于Hudi社区和Debezium社区已做如下贡献
线路图:如构建用于编排的UI,数据分析UI、认证鉴权相关等。
启动hudi spark任务命令及Hive Metastore的属性
Hudi中的清理策略配置