Flink中在使用聚合函数 GroupBy、Distinct、KeyBy 等函数时出现数据热点该如何解决?

数据倾斜和数据热点是所有大数据框架绕不过去的问题。处理这类问题主要从3个方面入手:

在业务上规避这类问题

例如一个假设订单场景,北京和上海两个城市订单量增长几十倍,其余城市的数据量不变。这时候我们在进行聚合的时候,北京和上海就会出现数据堆积,我们可以单独数据北京和上海的数据。

Key的设计上

把热key进行拆分,比如上个例子中的北京和上海,可以把北京和上海按照地区进行拆分聚合。

参数设置

Flink 1.9.0 SQL(Blink Planner) 性能优化中一项重要的改进就是升级了微批模型,即 MiniBatch。原理是缓存一定的数据后再触发处理,以减少对State的访问,从而提升吞吐和减少数据的输出量。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Apache Flink 聚合函数是用于将流数据进行聚合操作的函数,常用于实现基于间窗口或者滑动窗口的聚合操作。 下面是一个使用 Flink 聚合函数的例子: ``` DataStream<Tuple2<String, Integer>> input = ...; // 按照 key 分组,计算每个 key 出现的次数 DataStream<Tuple2<String, Integer>> result = input .keyBy(0) .timeWindow(Time.seconds(10)) .aggregate(new CountAggregator()); // 自定义计数器聚合函数 public static class CountAggregator implements AggregateFunction<Tuple2<String, Integer>, Integer, Integer> { @Override public Integer createAccumulator() { return 0; } @Override public Integer add(Tuple2<String, Integer> value, Integer accumulator) { return accumulator + 1; } @Override public Integer getResult(Integer accumulator) { return accumulator; } @Override public Integer merge(Integer a, Integer b) { return a + b; } } ``` 上述例子,我们首先定义了一个输入流 input,其包含了一个 Tuple2 类型的元素,第一个元素为 String 类型的 key,第二个元素为 Integer 类型的 value。 接着我们使用keyBy() 方法按照 key 进行分组,并使用 timeWindow() 方法定义了一个大小为 10 秒的间窗口。 最后我们使用了 aggregate() 方法来对每个窗口的元素进行聚合操作,其我们传入了一个自定义的计数器聚合函数 CountAggregator。 CountAggregator 实现了 AggregateFunction 接口,其 createAccumulator() 方法用于创建一个初始的计数器,add() 方法用于将输入元素累加到计数器,getResult() 方法用于返回计数器的结果,merge() 方法用于合并两个计数器的结果。 综上所述,上述例子我们使用Flink 自带的 keyBy()、timeWindow() 和 aggregate() 方法,以及自定义的计数器聚合函数 CountAggregator,来实现了按照 key 进行分组并计算每个 key 出现次数的聚合操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值