flink源码分析之CheckpointedFunction

 

public interface CheckpointedFunction {
	void snapshotState(FunctionSnapshotContext context) throws Exception;
	void initializeState(FunctionInitializationContext context) throws Exception;
}

CheckpointedFunction是有状态转化的核心接口,虽然有其他的更轻量级的接口,例如ListCheckpoint,但是CheckpointFunction接口更加灵活.

特别是对keyed state 和 operator state

1 initializeState方法在并行的装换算子被创建的时候会调用,并且通过该方法来访问OperatorStateStore和KeyedStateStore.

OperatorStateStore和KeyedStateStore提供了Flink用来访问state的数据结构,例如ValueState和ListState

2 snapshotState方法是在checkpoint要获得转换函数的state时被调用.其中的参数FunctionSnapshotContext会获得checkpoint的元数据信息.

例如  context.getCheckpointTimestamp 和 context.getCheckpointId

同时,也可以把该方法作为钩子函数来flush commit  synchronize 外部系统 例如 context.notify();

官方提供的例子

public class MyCheckpointFunction<T> implements MapFunction<T,T> , CheckpointedFunction {
    private ReducingState<Long> countperKey;
    private ListState<Long> countperPartition;

    private long localCount;
    @Override
    public T map(T value) throws Exception {
        countperKey.add(1L);
        localCount++;
        return value;
    }

    @Override
    public void snapshotState(FunctionSnapshotContext context) throws Exception {
        countperPartition.clear();
        countperPartition.add(localCount);
        context.notify();
    }

    @Override
    public void initializeState(FunctionInitializationContext context) throws Exception {
        countperKey = context.getKeyedStateStore().getReducingState(
                new ReducingStateDescriptor<Object>("countperKey",new AddFunction<>(),Long.class)
        );
        countperPartition = context.getOperatorStateStore().getListState(
                new ListStateDescriptor<>("countperPartition",Long.class)
        );

        for(long l:countperPartition.get()){
            localCount += l;
        }

    }

}

ps RichMapFunction也可以单独实现算子函数的stateful化

public class MyCountPerKeyFunction<T> extends RichMapFunction<T,T> {
    private ValueState<Long> count;

    public void open(Configuration config) throws Exception{
        count= getRuntimeContext().getState(new ValueStateDescriptor<>("count", Long.class));
    }

    @Override
    public T map(T value) throws Exception {
        Long current = count.value();
        count.update(current == null?1L:current+1);
        return null;
    }
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值