解决Flink keyby 数据倾斜

上一篇我们使用keyby后发现数据严重倾斜

https://blog.csdn.net/xingdianp/article/details/109953419

大概看下问题所在,大量数据在一个subtask中运行
在这里插入图片描述

这里我们使用两阶段keyby 解决该问题

之前的问题如下图所示
在这里插入图片描述

我们期望的是

在这里插入图片描述

但我们的需要根据key进行聚合统计,那么把相同的key放在不同的subtask如何统计?

我们看下图(只画了主要部分)

1.首先将key打散,我们加入将key转化为 key-随机数 ,保证数据散列

2.对打散后的数据进行聚合统计,这时我们会得到数据比如 : (key1-12,1),(key1-13,19),(key1-1,20),(key2-123,11),(key2-123,10)

3.将散列key还原成我们之前传入的key,这时我们的到数据是聚合统计后的结果,不是最初的原数据

4.二次keyby进行结果统计,输出到addSink

在这里插入图片描述

直接看实现代码

在这里插import org.apache.flink.api.common.functions.AggregateFunction
import org.apache.flink.api.common.state.{
   ValueState, ValueStateDescriptor}
import org.apache.flink.api.java.tuple.Tuple
import org.apache.flink.api.scala.typeutils.Types
import org.apache.flink.streaming.api.functions.KeyedProcessFunction
import org.apache.flink.streaming.api.functions.windowing.WindowFunction
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.streaming.api.windowing.windows.TimeWindow
import org.apache.flink.util.Collector
 
object ProcessFunctionScalaV2 {
   
 
 
  def main(args: Array[String]): Unit = {
   
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
    env.enableCheckpointing(2000)
    val stream: DataStream[String] = env.socketTextStream("localhost", 9999)
    val typeAndData: DataStream[(String, Long)] = stream.map(x => (
Flink中的数据倾斜是指在进行并行计算时,某些任务所处理的数据量远远大于其他任务处理的数据量,导致处理速度变慢,甚至引起任务失败。数据倾斜问题是分布式计算中常见的问题,而Flink提供了一些解决方案来应对这个问题。 以下是一些解决方案: 1. 手动重分区 手动重分区是最常见的解决方案之一。通过将数据进行重新分区,使得处理数据量较大的任务被分配到多个任务中,从而避免数据倾斜的问题。具体操作是,对于数据倾斜的key,可以将其分散到不同的分区中,使得每个分区中的数据量都不会过大。这种方法需要对数据进行重新分区,因此需要考虑分区的数量和分区的均衡性。 2. 增加并行度 增加并行度也是一种解决数据倾斜的方案。当一个任务的数据量过大时,可以通过增加任务的并行度来分散数据的处理,从而避免数据倾斜的问题。增加并行度可以通过增加TaskManager的数量或者使用更多的slot来实现。 3. 采用随机key 如果数据倾斜的原因是某些key的数据量过大,可以采用随机key的方式来解决问题。具体操作是,将原来的key进行替换,使用随机数作为新的key,从而实现数据的均衡分布。这种方法需要考虑随机key的生成方式和分配方式,以保证数据的正确性和处理效率。 4. 使用分桶技术 分桶技术是一种常用的解决数据倾斜问题的方案。具体操作是,将数据按照一定的规则分到不同的桶中,从而实现数据的均衡分布。Flink提供了BucketingSink等相关的API来实现数据的分桶操作。 5. 基于动态负载均衡的解决方案 基于动态负载均衡的解决方案是一种相对较新的解决方案。该方案通过监控任务的处理情况,动态地调整任务的分配策略,从而实现数据的均衡分布。具体实现可以采用Flink提供的TaskExecutor的动态调整功能,也可以使用第三方的负载均衡方案。 以上是Flink解决数据倾斜问题的一些方案,具体方法需要根据实际情况进行选择和调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值