Tutorial do Flink (16) ReducingState caso de uso de gerenciamento de estado com chave para encontrar o valor máximo

Série de artigos

Tutorial Flink (13) Gerenciamento de estado de estado com chave ValueState usando alarme de diferença de temperatura
Tutorial de Flink (14) caso de uso de MapState de gerenciamento de estado com chave
Tutorial de Flink (15) gerenciamento de estado de estado com chave ListState usando ValueState para implementar
tutorial de Flink (16) estado de estado com chave The ReducingState caso de uso de gerenciamento para encontrar o valor máximo
Flink tutorial (17) O caso de uso AggregatingState de gerenciamento de estado com chave para encontrar o valor médio

Um, o método de ReducingState

  • ReducingState é usado em conjunto com ReduceFunction
  • get () Pega o valor do estado
  • O método add (IN value) adiciona um elemento e aciona o reduceFunction para calcular uma vez
    Insira a descrição da imagem aqui

Em segundo lugar, o descritor de ReducingState

O descritor ReducingState é diferente do ValueState e ListState anteriores, ele deve ser usado em conjunto com um ReduceFunction.

Portanto, você deve implementar um ReduceFunction primeiro, como o mostrado a seguir, para calcular a temperatura mais alta.

public static class MyMaxTemp implements ReduceFunction<SensorRecord> {
    
    

    @Override
    public SensorRecord reduce(SensorRecord value1, SensorRecord value2) throws Exception {
    
    
        return value1.getRecord() >= value2.getRecord() ? value1 : value2;
    }
}

O segundo parâmetro de ReducingStateDescriptor é passado para novo SensorRecordUtils.MyMaxTemp ().
No futuro, toda vez que um dado entrar, o método reduce () deste MyMaxTemp será executado.

//用ReducingStateDescriptor定义描述器
    ReducingStateDescriptor reducingStateDescriptor = new ReducingStateDescriptor(
            "max-temp-state",//id
            new SensorRecordUtils.MyMaxTemp(),//ReduceFunction
            SensorRecord.class);//状态里的值的类型

//获取ReducingState
reducingState = getRuntimeContext().getReducingState(reducingStateDescriptor);

Três, o corpo principal do programa

public class Test05_ReduceState {
    
    

    public static void main(String[] args) throws Exception {
    
    

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        //方便测试,设置为1
        env.setParallelism(1);

        DataStreamSource<String> source = env.socketTextStream(BaseConstant.URL, BaseConstant.PORT);

        /*
        设置watermark和指定时间属性
         */
        SingleOutputStreamOperator<SensorRecord> dataStream = source
                .map(new SensorRecordUtils.BeanMap());

        dataStream
                .keyBy(SensorRecord::getId)
                .process(new MyKeyedProcessFunction())
                .print();

        env.execute();
    }
}

Quatro, classe de processamento KeyedProcessFunction

public static class MyKeyedProcessFunction extends KeyedProcessFunction<String, SensorRecord, SensorRecord> {
    
    

    private transient ReducingState reducingState;

    @Override
    public void open(Configuration parameters) throws Exception {
    
    
        super.open(parameters);

        //用ReducingStateDescriptor定义描述器
        ReducingStateDescriptor reducingStateDescriptor = new ReducingStateDescriptor(
                "max-temp-state",//id
                new SensorRecordUtils.MyMaxTemp(),//ReduceFunction
                SensorRecord.class);//状态里的值的类型

        //获取ReducingState
        reducingState = getRuntimeContext().getReducingState(reducingStateDescriptor);
    }

    @Override
    public void processElement(SensorRecord value, Context ctx, Collector<SensorRecord> out) throws Exception {
    
    

        reducingState.add(value);

        out.collect((SensorRecord) reducingState.get());
    }
}

resultado da operação:
Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/winterking3/article/details/115125313
Recomendado
Clasificación