阿里巴巴Blink SQL关键技术及实现原理
介绍了Blink SQL的多项关键技术及实现原理,并通过两个例子说明了具体的功能效果。
六大特性及背景介绍
(Blink架构)
作为纯粹的流式计算平台,Blink具有秒级甚至毫秒级的延迟,可以快速容忍故障,例如某个计算节点发生故障时。摔倒后可以很快恢复。它还支持动态扩展,并针对流媒体场景进行了大量优化。它具有最高的性能、高吞吐量和高资源利用率。它还解决了非常明显的数据损坏问题,并支持数据密集型计算流的需求。
什么是BlinkSQL
BlinkSQL在FlinkSQL的基础上增加了大量丰富的功能和性能优化。 SQL 作为一种声明性和可优化的语言具有巨大的优势。 Blink 的 SQL 查询优化器优化用户的 SQL 并制定最佳执行计划以获得高性能。同时,SQL易于理解,其中编写的业务逻辑清晰明了。
虽然SQL更多用于批处理,但它也适用于流式场景。从处理的数据文件来看,流处理的数据是无限的,而批处理面对的是有限的文件。从内部处理逻辑来看,批处理是一个单一的任务,而流处理是连续工作的,历史数据会被修正。
上图显示了包含时间戳和用户名的点击事件流。首先,我们对这些事件流进行流式统计,并对流的最后一个事件进行批量计算。流计算每次接收到数据都会触发一个结果。可以看到,无论是在流中还是在批中计数,该事件的最终结果都是6。由此可见,只要SQL语句和数据源相同,流式和批量计算结果不会有差异。同一条SQL在流式和批式模式下具有相同的语义,最终的结果也会一致。
五个概念一个实现
表流对偶性
表流对偶性是指表流转换信息无损且具有对偶性。
传统数据库表有两个最明显的属性:模式和数据。流也有模式和数据。还有一个重要的属性:时间。随着时间的推移,数据将不断流入流中。
上图中,对用户名关系表进行了DML操作。在每个插入命令之后,都会运行统计查询,并按用户维度对计数统计信息进行分组。在图像中插入第一个数据后,输入为 (mary, 1),插入数据后,输出将为 (Bob, 2), (mary, 1)。虽然操作时不显示相应的时间,但实际上它们都表示操作时间。传统的数据库表基本上也有时间属性。
这种情况下,数据库表和流只是属性相同。我们可以将特定的表视为流中某个时间分布的数据。
动态表
随时间变化的表可以称为动态表。这个概念不适用于传统的数据库表。由于传统数据库有事务管理,所以在执行查询的那一刻表的内容不会改变,因此是静态表。即使被查询,流中的数据也会不断变化。当数据回放时,可以回放到动态表中,动态表更改日志创建一个流。
连续查询和增量计算
连续查询是流式计算所独有的,不断更新结果并执行正在运行的查询。它是保证低延迟和数据更新的基础。
增量计算是一种可以提高流计算性能的计算实现。流中的每条数据都使用之前的计算结果进行聚合和统计计算。
早期辐射和下载
早期辐射用于保证计算流的低延迟要求,并尽快向下传输计算结果。由于流计算的结果会随着时间的推移而改变,即使流计算的结果在发送时是正确的,但稍后会产生新的结果,因此流方向上最初接收到的数据将会过时。牵引解决了这个问题。为了保证流计算的语义正确性,下载Early Emit计算结果并下发正确的计算结果。
两流JOIN的实现
在两流Join中,由于流上的流不一定相同,所以有可能轮询时数据不存在,而数据稍后出现。上图是一个 Blink join 解决方案,将左侧的数据存储在状态中,并在右侧的状态上执行 join 查询。同样,右侧数据的处理也是一样的。它首先保存在一种状态下,然后附加到另一种状态下的查询。
这样的过程有一个问题,就是进入状态时,对方可能没有任何数据。传统的数据库方法是将字段留空,流中的数据会实时变化。当前没有连接数据,但这并不意味着下一时刻就会有数据。不是。需要使用下载机制来下载之前的空数据,并在正确的数据到达时填充新的数据,如上图所示。
总结
这里我们总结了这5个概念。首先,利用展开表的二元性,展开表的转换可以有理论支持,展开表可以相互转换;有了动态表的概念,SQL就可以作用于流,进行连续查询;用连续查询的概念,真正说明SQL计算的流永远不会结束,结果总是更新;增量计算与需求和引擎优化相结合,带来较高的 Blink 性能; Early Emit 和 Retraction,使用 Blink 来实现接近秒级和毫秒级的无限低延迟。同时保证了流语义的正确性。
两种案例及总结
案例1 – 无密钥热点
对于具有多个块的数据源,每个块将由相应的节点处理。理想情况下,每个节点的处理能力相等,负载均衡。然而,在实际场景中可能会出现处理不平衡的情况。例如,节点无法处理负载。为此,我们需要减少节点无法处理的负载。由另一个节点部分分配。
Blink 为此提供了 Dynamic Rebalance,它感知下游节点的压力,并将繁忙节点无法处理的数据分发到空闲节点。需要注意的是,目前的情况是无密钥节点,这意味着数据可以在任何节点上处理。
案例2 – Key Hotspot
key就是按key对数据进行分组,相同的key必须到同一个节点。虽然此时框架也可以感知到反压,但是它无法利用反压机制来重新分配节点中的数据。
目前使用本地-全局聚合。另一种数据热点优化解决方案是通过系统内查询优化器进行补充,使其对用户不可见。首先,它在本地对每个节点的数据执行本地聚合。图中不同颜色代表不同的按键。在本地,它们会进行本地聚合,因此原来的4条上游记录变成了1条,这很大程度上减轻了下游节点的压力。
总结
Blink SQL具有标准语义,完全支持标准ANSI SQL,并且具有UDF、JOIN、双流JOIN等丰富的功能。它具有更好的性能,对各种ANSI SQL语法特性做了多项性能优化。它提供了集开发、测试、部署、监控和升级于一体的综合平台,让用户专注于自己的业务。
作者:IT大佬说
链接:https://juejin.im/post/5b8609a6e51d4538d12ca085
来源:掘金。作者归作者所有商业转载请联系作者获取授权。非商业转载请注明出处。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。