伴随着云原生、大数据等新型技术的发展,国内技术开源生态发展日益成熟。政策上,“十四五”规划首次把开源纳入顶层设计,开放、平等、协作、共享的开源模式,正重塑软件发展新生态,不断推动开源生态繁荣。
作为基础软件领域的领先者,滴普科技在Flink、Iceberg、Trino几大社区作出重要贡献。今天主要就DLink支持Iceberg维度表Lookupjoin进行技术分享,回馈开源社区。撰文
王鹏飞编辑
昕然本文共计字,阅读需要3分钟
在之前的连载文章中,介绍了DLink流批一体技术架构及优势,其中提到支持Iceberg维度表的Lookupjoin的功能,这个功能目前在Iceberg社区还不支持。本文就基于原理和实际操作讲解DLink流批一体Lookupjoin的功能以及未来规划。
1
需求背景
维度表在大数据应用场景很多,数据源可能来自不同系统,在数据入湖时事实表的一些信息往往不满足客户分析诉求,所以需要在数据入湖前用维度表将事实表进行打宽。
如数据源有商品的ID,价格信息,没有各国汇率信息,那么就没有办法分析人民币的总价值,这需要维度表保存汇率信息,在数据入湖前将汇率信息和数据源进行Join,再将新的数据入湖。
这里涉及到流批数据和批数据进行Join,DLink通过Lookupjoin实现支持。以MySQL作为数据源为例,以下是大致数据流:
DCT:滴普科技自研的数据采集传输服务
2
Lookupjoin实现原理操作
1.基本原理
目前Iceberg社区实现的connector只支持Scantable。我们现在支持Lookuptable,是扩展了connector的功能。以下是主要设计思路:
(1)通过数据源的流式计算,做projection将数据源进行抽取,得到extract流;
(2)根据extract流式数据中的Key在Iceberg维度表中找到对应的行数据;
(3)通过内部机制链式流计算将数据进行整合和做flatmap,fliter等算子操作,得到最终Join的结果数据;
(4)DLink内部增加Icebeg维度表的cache,可以直接将数据流在cache中查找维度表数据,如果cache里面没有命中就从iceberg读取维度表数据。目前通过自研的缓存替换算法,缓存命中率较高,提高Join效率。
2.操作流程和建议
(1)构造商品汇率维表场景:
数据源:
汇率维度表:
(2)DLink内置connector,建表操作更简单:
步骤一:使用DLink的SQL编辑器建Kafka映射表,然后可以用数据源给Kafka导入数据:
步骤二:使用DLink的SQL编辑器建立Iceberg维度表,给维度表同步数据:
步骤三:Kafka映射表和Iceberg维度表做Lookupjoin,使用语法:tableorquerynameJOINtableorquerynameFORSYSTEM_TIMEASOFproctimeONjoincondition
执行Lookupjoin的结果:
3.实际应用中维表场景差异较大,我们基于客户基于实际业务场景,设计了不同的解决方案,客户可以灵活选择Lookupjoin策略:(维表同步策略将在后续有专题讨论)
4.经过我们初步测试,在6个CU,3GB内存的环境上,通过调整缓存策略,iceberglookuptablejoin性能相比原生lookuptablejoin能提升2-10倍,缓存预全量加载的方式可以有倍提升,1千万条数据能在内秒完成处理。
经过实际测试,不缓存和缓存处理效率比大概是:N*/(N*(1-M%)*+N*M%*0.),其中M%是命中率,N是数据量。缓存处理效率会随命中率变低而曲线得下降,所以这块性能还有一定优化空间:1)合理同步策略提高命中率;2)提升未命中的查表效率,包括优化Iceberg查表速度,增加Flink的批查等功能。
3
未来规划
在实际业务场景下,数据的移动和访问,搜索引擎服务、机器学习服务、大数据分析服务都涉及到数据在本地(本系统)和数据湖之间的移动,以及数据在不同服务之间的移动。
我们目前正在规划支持Lookupjoin批查以及Temporaltablejoin功能。完善后再回馈给社区。
1.支持Lookupjoin批查,优化join的性能
目前Lookupjoin只支持点查,就是每次获取源表中一条数据,根据key的值在维表中查询一条数据。这种方法每次数据匹配都要查询数据表,可能占用较多网络和磁盘IO,所以考虑实现将多个点查批量处理,从iceberg一次获取需要查询需要的行,减少了网络消耗和磁盘IO,从而提高Lookupjoin的性能。以下是功能示意图:
2.支持Temporaltablejoin
简单介绍Temporaltablejoin,这是支持多版本的lookupjoin,能简化很多操作,可参考如下场景:
orders表是源表
/p>
汇率维度表:
执行Teamporaltablejoin期望的结果是:
这个几个功能目前社区还未支持,DLink将在Flink、Iceberg、Trino等开源组件上的优化和新特性逐步回馈开源社区,与国内外同行共建良好的大数据生态。