万字长文揭秘:阿里如何实现海量数据实时分析?(8)

同样的在实际应用中是很难要求用户来辨别快慢查询,因为用户的业务本身可能就没有快慢业务之分。另外对于在线查询,查询的计算量也是不可预知的。为此,计算引擎在Runtime层面引入了快慢查询的识别机制,参考Linux kernel中vruntime的方式,对算子的执行时间、调度次数等信息进行统计,当算子的计算量达到给定的慢查询的阈值后,会把算子从高优先级的线程转移到低优先级的线程中。这有效提高了在压力测试下快查询的响应时间。

[本文来自:www.11jj.com]

  [原文来自:www.11jj.com]

代码生成器

Dynamic code generation(CodeGen)普遍出现在业界的各大计算引擎设计实现中。它不仅能够提供灵活的实现,减少代码开发量,同样在性能优化方面也有着较多的应用。但是同时基于ANTLR ASM的AnalyticDB代码生成器也引入了数十毫秒编译等待时间,这在实时分析场景中是不可接受的。为了进一步减少这种延迟,分析引擎使用了缓存来重用生成的Java字节码。但是,它并非能对所有情况都起很好作用。

随着业务的广泛使用以及对性能的进一步追求,系统针对具体的情况对CodeGen做了进一步的优化。使用了Loading Cache对已经生成的动态代码进行缓存,但是SQL表达式中往往会出现常量(例如,substr(col1,1, 3),col1 like‘demo%’等),在原始的生成逻辑中会直接生成常量使用。这导致很多相同的方法在遇到不同的常量值时需要生成一整套新的逻辑。这样在高并发场景下,cache命中率很低,并且导致JDK的meta区增长速度较快,更频繁地触发GC,从而导致查询延迟抖动。

substr(col1,  1, 3)

=>  cacheKey<CallExpression(substr), inputReferenceExpression(col1),  constantExpression(1), constantExpression(3)>cacheValue bytecode;

 

通过对表达式的常量在生成bytecode阶段进行rewrite,对出现的每个常量在Class级别生成对应的成员变量来存储,去掉了Cachekey中的常量影响因素,使得可以在不同常量下使用相同的生成代码。命中的CodeGen将在plan阶段instance级别的进行常量赋值。

substr(col1,  1, 3)

=>  cacheKey<CallExpression(substr),  inputReferenceExpression(col1)>cacheValue bytecode;

 

在测试与线上场景中,经过优化很多高并发的场景不再出现meta区的GC,这显著增加了缓存命中率,整体运行稳定性以及平均延迟均有一定的提升。

 

AnalyticDB CodeGen不仅实现了谓词评估,还支持了算子级别运算。例如,在复杂SQL且数据量较大的场景下,数据会多次shuffle拷贝,在partitioned shuffle进行数据拷贝的时候很容易出现CPU瓶颈。用于连接和聚合操作的数据Shuffle通常会复制从源数据块到目标数据块的行,伪代码如下所示:

foreach row

   foreach column

      type.append(blockSrc, position, blockDest);

从生产环境,大部分SQL每次shuffle的数据量较大,但是列很少。那么首先想到的就是forloop的展开。那么上面的伪代码就可以转换成

foreach  row

   type(1).append(blockSrc(1), position,  blockDest(1));

   type(2).append(blockSrc(2), position,  blockDest(2));

   type(3).append(blockSrc(3), position,  blockDest(3));

 

上面的优化通过直接编码是无法完成的,需要根据SQL具体的column情况动态的生成对应的代码实现。在测试中1000w的数据量级拷贝延时可以提升24%。

 

矢量化引擎和二进制数据处理

相对于行式计算,AnalyticDB的矢量化计算由于对缓存更加友好,并避免了不必要的数据加载,从而拥有了更高的效率。在这之上,AnalyticDB CodeGen也将运行态因素考虑在内,能够轻松利用异构硬件的强大功能。例如,在CPU支持AVX-512指令集的集群,AnalyticDB可以生成使用SIMD的字节码。同时AnalyticDB内部所有计算都是基于二进制数据,而不是Java Object,有效避免了序列化和反序列化开销。

极致弹性

在多租户基础上,AnalyticDB对每个租户的DB支持在线升降配,扩缩容,操作过程中无需停服,对业务几乎透明。以下图为例:

万字长文揭秘:阿里如何实现海量数据实时分析?(8)

  • 用户开始可以在云上开通包含两个C4资源的DB进行业务试用和上线(图中的P1, P2...代表表的数据分区)

  • 自媒体 微信号:11jj 扫描二维码关注公众号
    爱八卦,爱爆料。

    小编推荐

    1. 1

      数字易经0到9代表什么卦(数字易经测算)

      大家好,小伟今天来为大家解答数字易经0到9代表什么卦以下问题,数字易经测算很多人还不知道,现在让我们一起来看看吧!1、数字1代表坎水、数

    2. 2

      苹果手机呼叫转移怎么设置(苹果手机呼叫转移怎么设置无法接通)

      大家好,小乐今天来为大家解答苹果手机呼叫转移怎么设置以下问题,苹果手机呼叫转移怎么设置无法接通很多人还不知道,现在让我们一起来看看

    3. 3

      中国红十字会标志简笔画(中国红十字会标志简笔画)

      大家好,小豪今天来为大家解答中国红十字会标志简笔画以下问题,中国红十字会标志简笔画很多人还不知道,现在让我们一起来看看吧!1、保护性

    4. 4

      八年级下册语文书人教版电子书(八年级下册语文书人教版电子书2022)

      大家好,小美今天来为大家解答八年级下册语文书人教版电子书以下问题,八年级下册语文书人教版电子书2022很多人还不知道,现在让我们一起来看

    5. 5

      古伊尔(魔兽古伊尔)

      大家好,小丽今天来为大家解答古伊尔以下问题,魔兽古伊尔很多人还不知道,现在让我们一起来看看吧!1、古伊尔是魔兽世界里面部落的一个酋长

    6. 6

      唯一极值点问题

      在高档数学的进修中,我们经常会碰着独一驻点的问题,在非常宽松的前提下,这个独一的驻点也就是极值点。今天我们稍微改变一下前提,商量如

    7. 7

      三公九卿制是什么(三公九卿制是什么朝代的制度)

      大家好,小乐今天来为大家解答三公九卿制是什么以下问题,三公九卿制是什么朝代的制度很多人还不知道,现在让我们一起来看看吧!1、三公九卿

    8. 8

      订房网哪个平台好(订房什么网最便宜)

      大家好,小娟今天来为大家解答订房网哪个平台好以下问题,订房什么网最便宜很多人还不知道,现在让我们一起来看看吧!1、携程、美团、艺龙、

    Copyright 2024.依依自媒体,让大家了解更多图文资讯!