Flink--window数据倾斜

1.window数据倾斜

对于集群系统,一般缓存是分布式的,即不同节点负责一定范围的缓存数据。我们把缓存数据分散度不够,导致大量的缓存数据集中到了一台或几台服务节点上,称为数据倾斜。一般来说,数据倾斜是由于负载均衡实施的效果不好引起的。
简单的讲,数据倾斜就是我们在计算数据的时候,数据的分散度不够,导致大量的数据集中到了集群中的一台或者几台机器上计算,而集群中其它节点空闲。这些倾斜了的数据的计算速度远远小于平均计算速度,导致整个计算过程慢。

2.数据倾斜的解决思路

场景:分项目统计某个时间粒度的pv数据。
数据情况:每个项目的数据量不同,某个项目的数据量很大,导致这个项目的窗口中的数据很大,发生倾斜。
解决思路
思路一:针对window原始方式中在窗口触发前,是以数据积攒的方式进行的。所以针对这种方式可以在window后跟一个reduce方法,在窗口触发前采用该方法进行聚合操作(类似于MapReduce中map端combiner预处理思路)。
思路二:
思路一中处理后仍有倾斜问题,或者也可以直接采用思路二进行优化、处理。将key进行扩展,扩展成自定义的负载数,即,将原始的key封装后新的带负载数的key,进行逻辑处理,然后再对新key的计算结果进行聚合,聚合成原始逻辑的结果。

具体实现思路:
1. 人为查看具体的倾斜的(数据量大的项目码,例如Code1)。
2. 将原始的数据元组中keyby分组的键进行扩展,扩展指定的负载个数。

例如:
优化前:
数据元组:(项目码,1)如,(code1,1)(code2,1)(code3,1)(code1,1)…
优化后:
数据元组:项目码-负载标识,1)如,(code1-0,1)(code1-1,1)(code1-2,1)…
上述的示例,将数据倾斜的流,进行了负载,负载为3(0,1,2)
如图:扩展K
Flink--window数据倾斜_第1张图片
优化前的keyed流:
Flink--window数据倾斜_第2张图片优化后的keyed流:
Flink--window数据倾斜_第3张图片可见,对数据量大的流进行二次分流,实现了负载,解决了数据倾斜的问题。

3.按照新的组合的key进行keyby,这样,会根据在自定义的负载数,对数据量大的项目(流),进行负载,并进行初步的window处理(输出的元组格式:(项目码,pv数)
例如:(code1,457343487),(code2,45683)…)
优化前:
Flink--window数据倾斜_第4张图片优化后:
Flink--window数据倾斜_第5张图片4.步骤3中的窗口结果的key(和目标的key相同)再次进行keyby操作,这一步目的在于将之前负载分散后的结果,做最后的聚合,组合成目标逻辑的结果

优化前:
Flink--window数据倾斜_第6张图片优化后:
Flink--window数据倾斜_第7张图片这样,数据倾斜问题就解决了。

以下为优化前后完整拓扑图
优化前:
Flink--window数据倾斜_第8张图片优化后:
Flink--window数据倾斜_第9张图片

你可能感兴趣的:(大数据)