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