【Flink实战系列】Flink累加器的使用(accumulator)

本文介绍了Flink的Accumulator(累加器)功能,类似于Spark的Accumulator,用于在任务执行过程中观察数据变化。通过四个步骤详细阐述了如何创建、注册、使用和获取累加器结果,并提供了一个完整示例。在Flink任务完成后,可以通过UI界面查看累加器信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flink的Accumulator即累加器,与Saprk Accumulator 的应用场景差不多,都能很好地观察task在运行期间的数据变化
可以在Flink job任务中的算子函数中操作累加器,但是只能在任务执行结束之后才能获得累加器的最终结果。spark的累加器用法.

Flink中累加器的用法非常的简单:

1:创建累加器:      val acc = new IntCounter();

2:注册累加器:      getRuntimeContext().addAccumulator("accumulator", acc );

3:使用累加器:       this.acc.add(1);

4:获取累加器的结果:  myJobExecutionResult.getAccumulatorResult("accumulator")

下面看一个完整的demo:

package flink

import org.apache.flink.api.common.accumulators.IntCounter
import org.apache.flink.api.common.functions.RichMapFunction
im
在Apache Flink中,`AggregateFunction`是一个用于定义自定义聚合操作的接口。它是Flink流处理和批处理API中的一部分,允许开发者在数据流上进行复杂的聚合操作。`AggregateFunction`通过三个主要方法来实现聚合逻辑: 1. **createAccumulator()**: 初始化一个累加器,用于存储聚合的中间结果。 2. **add()**: 将输入元素添加到累加器中,并返回更新后的累加器。 3. **getResult()**: 从累加器中提取最终的聚合结果。 以下是一个简单的示例,展示了如何使用`AggregateFunction`来计算数据流中的平均值: ```java import org.apache.flink.api.common.functions.AggregateFunction; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class AverageAggregate implements AggregateFunction<Tuple2<Long, Long>, Tuple3<Long, Long, Long>, Double> { @Override public Tuple3<Long, Long, Long> createAccumulator() { return new Tuple3<>(0L, 0L, 0L); } @Override public Tuple3<Long, Long, Long> add(Tuple2<Long, Long> value, Tuple3<Long, Long, Long> accumulator) { return new Tuple3<>(accumulator.f0 + value.f0, accumulator.f1 + value.f1, accumulator.f2 + 1L); } @Override public Double getResult(Tuple3<Long, Long, Long> accumulator) { return ((double) accumulator.f0) / accumulator.f2; } @Override public Tuple3<Long, Long, Long> merge(Tuple3<Long, Long, Long> a, Tuple3<Long, Long, Long> b) { return new Tuple3<>(a.f0 + b.f0, a.f1 + b.f1, a.f2 + b.f2); } public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Tuple2<Long, Long>> input = env.fromElements( new Tuple2<>(1L, 3L), new Tuple2<>(1L, 5L), new Tuple2<>(1L, 7L), new Tuple2<>(2L, 4L), new Tuple2<>(2L, 2L), new Tuple2<>(2L, 6L) ); DataStream<Double> output = input.keyBy(0).aggregate(new AverageAggregate()); output.print(); env.execute("Average Aggregate Example"); } } ``` 在这个示例中,`AverageAggregate`类实现了`AggregateFunction`接口,并计算了数据流中每个键的平均值。`createAccumulator`方法初始化累加器,`add`方法将输入元素添加到累加器中,`getResult`方法从累加器中提取最终的聚合结果,`merge`方法用于合并两个累加器
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JasonLee实时计算

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值