【Flink】如何定义一个HashSet的ValueState?

文章讲述了作者在使用ApacheFlink的ValueState时,如何从使用Class类到发现并利用TypeInformation和TypeSerializer解决将HashSet作为ValueStateDescriptor参数的问题,简化了代码并提高了灵活性。

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

在之前用Flink的ValueState时,我总会把ValueStateDescriptor<Integer>("count", Integer.class)的第二个参数写作XXX.class,导致今天在测试时,无法把HashSet.class作为参数给ValueStateDescriptor。

于是我尝试用Class.forName来传入HashSet:

ValueState<HashSet<Integer>> set ;
@Override
public void open(Configuration parameters) throws Exception {
    set = getRuntimeContext().getState(new ValueStateDescriptor<HashSet<Integer>>("hashSet", (Class<HashSet<Integer>>) Class.forName("java.util.HashSet")));
}

虽然问题得以解决,但是参数名过于冗余,我便查看Flink的源代码,寻找其他思路:

public ValueStateDescriptor(String name, Class<T> typeClass) {
    super(name, typeClass, (Object)null);
}

public ValueStateDescriptor(String name, TypeInformation<T> typeInfo) {
    super(name, typeInfo, (Object)null);
}

public ValueStateDescriptor(String name, TypeSerializer<T> typeSerializer) {
    super(name, typeSerializer, (Object)null);
}

翻阅ValueStateDescriptor的源码,我发现,ValueStateDescriptor并不是只能传入Class这一种参数,还可以传入TypeInformation,TypeSerializer,我便想到了第二种方法:

ValueState<HashSet<Integer>> set;
            
@Override
public void open(Configuration parameters) throws Exception {
    pvCount = getRuntimeContext().getState(new ValueStateDescriptor<Integer>("pvCount", Integer.class));
    set = getRuntimeContext().getState(new ValueStateDescriptor<HashSet<Integer>>("uvCount", TypeInformation.of(new TypeHint<HashSet<Integer>>() {})));
}

至此,问题得以解决。

在Apache Flink中,水印(Watermark)是一种用于处理事件时间(Event Time)流式数据的时间概念,用于表征事件时间的进展。水印是Flink处理乱序事件流时,衡量事件时间进度的一种机制。它允许Flink在不确定数据完整性的前提下,对事件进行处理和分析。 水印通常定义一个带时间戳的特殊数据元素,当流中的水印到达某个特定的算子时,它告诉该算子当前处理进度的最大事件时间。如果一个算子收到了所有事件时间小于或等于当前水印时间戳的事件,那么该算子可以安全地认为从时间戳最小的事件到水印时间戳之间的所有事件都已经被处理过了。 定义水印的常见方法有以下几种: 1. 固定延迟水印:在事件时间戳的基础上添加一个固定的延迟时间。例如,如果事件的最大可能延迟是2秒,水印可以定义为 `Watermark = currentMaxEventTimestamp - 2s`。 2. 自定义逻辑水印:根据特定的逻辑来生成水印。例如,可以在流中监控事件的到达模式,并据此生成水印。 3. 无水印:某些情况下,如果不需要考虑事件乱序或者有其他机制保证事件顺序,则可以不定义水印。 在Flink代码中,可以使用WatermarkStrategy来定义水印策略。例如: ```java WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(2)) ``` 上述代码表示定义一个水印策略,该策略会在事件时间戳的基础上添加2秒的固定延迟作为水印。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值