Flink State实战,写入查询

State

state是实现flink一次性语义的核心,在1.9之后增加了API来读取state

写State

import org.apache.flink.api.common.state.ListState;
import org.apache.flink.api.common.state.ListStateDescriptor;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.runtime.state.FunctionInitializationContext;
import org.apache.flink.runtime.state.FunctionSnapshotContext;
import org.apache.flink.runtime.state.memory.MemoryStateBackend;
import org.apache.flink.state.api.BootstrapTransformation;
import org.apache.flink.state.api.OperatorTransformation;
import org.apache.flink.state.api.Savepoint;
import org.apache.flink.state.api.functions.StateBootstrapFunction;


public class TestState {


    public static void main(String[] args) {
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        DataSet<Integer> data = env.fromElements(1, 2, 3);
        BootstrapTransformation transformation = OperatorTransformation
                .bootstrapWith(data)
                .transform(new SimpleBootstrapFunction());

        Savepoint
                .create(new MemoryStateBackend(), 2)
                .withOperator("uid1", transformation)
                .write("/xx/xx");
        try {
            env.execute("aa");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}


class SimpleBootstrapFunction extends StateBootstrapFunction<Integer> {

    private ListState<Integer> state;

    @Override
    public void processElement(Integer value, Context ctx) throws Exception {
        System.out.println(value);
        state.add(value);
    }

    @Override
    public void snapshotState(FunctionSnapshotContext context) throws Exception {
    }

    @Override
    public void initializeState(FunctionInitializationContext context) throws Exception {
        //注意这里的写入state 描述
        state = context.getOperatorStateStore().getListState(new ListStateDescriptor<>("state", Types.INT));
    }
}

读State

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.runtime.state.memory.MemoryStateBackend;
import org.apache.flink.state.api.ExistingSavepoint;
import org.apache.flink.state.api.Savepoint;

import java.io.IOException;

public class TestRead {

    public static void main(String[] args) {
        ExecutionEnvironment bEnv = ExecutionEnvironment.getExecutionEnvironment();
        try {
            ExistingSavepoint savepoint = Savepoint.load(bEnv, "/xx/xx", new MemoryStateBackend());
            DataSet<Integer> aa = savepoint.readListState("uid1", "state", Types.INT);
            aa.map(new MapFunction<Integer, Object>() {

                @Override
                public Object map(Integer integer) throws Exception {
                    return integer;
                }
            }).print();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

总结

有的情况下需要得到这个state的具体数据,这个API很好的解决了这个问题
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1eejtxt66xjvz

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章