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

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