您的位置 首页 > 德语词汇

clustering是什么意思、读音,探索Snowflake auto clustering 设计

大家好,今天小编来为大家解答以下的问题,关于clustering是什么意思、读音,探索Snowflake auto clustering 设计这个很多人还不知道,现在让我们一起来看看吧!

1、SnowflakeIPO大火之后,大家都开始慢慢了解到这个完全基于云计算设计的新式数据仓库。Snowflake的核心在于基于云端近似无限的计算存储资源,提供了极致弹性且高效的计算引擎并且搭配低成本且同样弹性伸缩的存储,大大减少了用户的心智负担和数据的计算存储成本,让用户更加专注于发挥数据对业务的价值。对于传统的数据仓库来说,Snowflake就像一块降维打击的二向箔。

2、在业务增长的过程中,客户的数据持续增长,从而导致单表变大,对大表的高效分析依赖于一套高性能的查询引擎。Snowflake有一个非常核心的功能:AutoClustering,极大地提升了大表的查询效率。我们这里主要探索下,Snowflake的AutoClustering功能是如何设计的。

clustering是什么意思、读音,探索Snowflake auto clustering 设计

3、注意:这里的Clustering是指分组、聚类的意思,注意不要理解为分布式、集群等概念。

4、Snowflake的Clustering功能和传统数据的Partition分区功能类似。但在传统的数据库系统中,大多依赖一些静态的分区规则来实现数据的物理隔离,如按时间,按用户特征hash等等,在hive等数据仓库中,最常见到的还是按照时间分区。当一个带有分区字段相关的查询过来的时候,分区的裁剪可以直接忽略掉不匹配的数据,这样就可以大大减少了数据的读取和计算量,从而提高查询性能。

5、静态分区用法非常简单,比如在Hive中:

6、--CreatePartition\nALTERTABLEtable_nameADDPARTITION(dt='2020-03-26',hour='08')location'/path/table/20200326/08';\n--Thenloaddataintothepartition

但它有以下一些缺点:

7、Snowflake在设计中完全抛弃了传统的静态Partition的概念,而提出了AutoClustering的新设计。简而言之,用户再也不用关心我的表是如何如何分区了,用户只管插入和查询就是了,数据分组,性能优化我会自动做!!!

8、虽然抛弃了静态分区,但snowflake里面还是有Micro-Partition和ClusterKey的概念。

9、注:鉴于Micro-Partition的大小可能到500MB,个人认为Micro-Partition的内部按道理应当划分类似Parquet的pages(clickhouse的mrk),每个page有自己的索引,这样就可以在Micro-Partition内部提高查询过滤的性能。不过看Snowflake目前的设计来说,微分区级别索引是最小粒度了,暂时没有微分区内部pages索引了,具体原因未知,文章末尾会提到个人的一些猜测。

10、数据表建立后,默认数据是自然序,自然序意味着我们没有做任何处理,数据就按照流入的顺序排列,此时表处于Unclustered状态。当表经历了Clustering后,每个Micro-Partitions会按照指定的key进行排序,可以理解为给表加了一个排序键,此时表处于Clustered状态。

11、Clustered的主要目的是让大部分的查询能高效的裁剪数据,避免不需要的IO读取和计算。

12、selectname,countryfromt1wheretype=2anddate='11/2';

在原始的数据排列中(自然序),上面的SQL会扫描到4个微分区。而在Clustered状态下,数据已经按照ClusterKey->(date,type)进行排序,所以只会扫描到1个微分区,其他的微分区都被引擎结合了存储在元数据的索引进行了裁剪过滤。

13、一般来说,大表不会是静态的数据,大多会是时序数据,也就是说说数据不断地实时流入。因此,对整个表级别的数据全排序是非常不现实的,不仅代价较高,实时流入的数据也会影响全排序结果。另外一种方法是只对流入的数据进行排序,这样虽然新数据有比较好的顺序,但随着数据在不断地流入,数据整体的顺序会逐渐趋于混乱。

14、结合上面的分析,一个表如果能达到Well-Clustered(表数据的整体有序度高),这样查询才能高效。在这个前提下,还需要保证“新数据能实时高效流入“(确保DML高效),两者之间存在一个平衡点,Snowflake的做法是优先保证新数据能实时高效流入,新数据是不需要对数据整体的有序度“负责”,因为新数据相比历史数据来说量级较小,影响的有序度也较小,它只需保证局部有序就行了(确保新数据查询也能高效)。新数据在后台会异步进行合并,保证”表数据的整体有序度高“,也就是说数据的整体有序是一个渐进的过程,而不是整体绝对有序的。

15、Snowflake引入了几个主要的指标来衡量表的Well-Clustered程度:

16、Micro-Partitions\nMicro-Partitions

上面的图从上到下展示了四种表Cluster的状态,第一种情况是4个微分区完全重叠,这种情况是最糟糕的,因为它没有任何区分度,命中了A-Z这个Range的查询会不可避免地扫描四个分区。随着Depth指标的下降,表中微分区变得逐渐离散,Overlaps指标也在下降,表也逐渐变得更加Well-Clustered。

17、当然,在实际的表分布中,微分区的分布要达到最下面那样规整(全局有序)是不现实的,因为所需要的开销太大了。

18、为了减少写放大,微分区的合并策略和LSM-tree类似,微分区在后台不断地合并后形成新的微分区,每次合并完成后,微分区的Level值就会自增(clickhouse也有类似的Part合并逻辑),所以Level表示的就是微分区经历过的合并次数(用来衡量经历过的合并成本)。新数据流入的微分区Level默认是0,Level越低的微分区中,Overlaps和Depth指标相对来说会越高,在不断合并的过程中,微分区变得越来越离散,表也变得更加Well-Clustered。

19、注意:微分区只会和同Level的微分区合并,Level存在最大值,避免写放大太严重。

20、AutoClustering主要分为两大任务:

21、这块和ClickHouse的逻辑很类似,但明显的区别是Snowflake对云实在太偏爱了,上面所有的任务都可以在云端拉起独立的进程进行,而不需要占用用户的计算资源,并且这两个进程也是微服务化的,可以按需弹性伸缩。

22、Selection任务会从某个Level中选择出微分区列表集合,选择的策略是启发式的。

23、上面提到的2个指标可以构建一个启发式的算法:

24、因此Selection的目标就是降低Level中微分区的平均深度,AvgDepth。

25、这里引入一个AvgDepth的计算逻辑:

26、我们对每个端点进行分析,如果没有overlap,depth忽略,因为depth的目的就是衡量overflap的程度,引入depth=0会导致数据有偏差,此时depth表示一个端点覆盖了几个分区。

27、AvgDepth=Sum(DepthOfOverflapPoint)/OverflapPointsCnt

Snowflake没有公开具体的Selection算法,不过大概是Level+AvgDepth结合的一个公式进行排序,我们假设它是以每个Level的AvgDepth排序选择某个Level,然后去顺序遍历此Level下的所有端点,超过了AvgDepth的连续端点会被选择作为Range。

28、横轴对应的就是Key的Range,纵轴表示Depth,计算方式大概是:遍历所有的微分区,将微分区的Range的Depth进行求和(即上面的DepthOfOverflapPoint),得出对应端点的Y值(这里应该可以用差分数组的数据结构进行优化)

29、上图是选择了两个微分区列表的集合示例,选择的方式是顺序遍历所有的端点,如果端点的Depth超过了AvgDepth,就会被选择,连续选择的端点构成一个Range。

30、可以发现最高点Depth虽然最高,但覆盖的Range变窄,这样导致选择的微分区数量太小,对降低AvgDepth的影响较少。

31、看有多少个符合条件的波峰,上图是两个符合条件的波峰,这两个波峰互不重合,可以作为选择的结果集合,集合中内包含了微分区的batches。

32、ClickHouse中也有类似的选择策略算法,建议读者有时间也可以去了解下。

33、接收到Selection的列表后,Part-Merge可以独立地进行微分区的排序和合并,类似一个归并排序的过程。合并后的微分区就是一个全局有序的大微分区了。值得一提的是,合并后的分区如果超过了500MB的阈值上限,就会被分裂成更小的微分区,这和ClickHouse存储一个大的分区文件是不同的。

34、Selection和Merge进行不会对原始数据持有锁,也就是说在这两个过程中都不会卡主用户数据的查询和插入。这个优化其实很简单,就是在合并之后,持有对合并涉及的微分区的锁,然后标记下新的微分区为Active状态,老的微分区为Outdate状态,异步GC删除,一些标志位的更新,涉及锁开销可以忽略不计。

35、就是上面讲的Selection和Merge做成两个独立的服务异步运行。Snowflake旧版本提供了手动Cluster,后面废弃了,我猜测更多是让用户使用便捷,不用去CareClustering这层操作,因为这些事情后台会自动做了,不当地频繁clustering反而增加了不必要的开销。

36、虽然clustering没有用客户的计算资源,但收费还是要算在用户头上的,在Billing&Usage页面可以看到对应的计费情况。

37、出处:https://zhuanlan.zhihu.com/p/490719154

OK,本文到此结束,希望对大家有所帮助。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023