У меня есть приложение Flink в сервисе AWS Kinesis Analytics. Мне нужно отфильтровать некоторые значения в потоке данных на основе порога. Кроме того, я передаю пороговый параметр с помощью сервиса AWS Systems Manager Parameter Store. На данный момент я получил это:

  • В моем основном классе:
val threshold: Int = ssmParameter.getParameterRequest(ssmClient, "/kinesis/threshold").toInt

val kinesis_deserialization_schema = new KinesisDeserialization[ID]
            val KinesisConsumer = new FlinkKinesisConsumer[ID](
                "Data-Stream",
                kinesis_deserialization_schema,
                consumerProps
            )
            val KinesisSource = env.addSource(KinesisConsumer).name(s"Kinesis Data")
val valid_data = KinesisSource
          .filter(new MyFilter[ID](threshold))
          .name("FilterData")
          .uid("FilterData")
  • Класс фильтра:
import cl.mydata.InputData
import org.apache.flink.api.common.functions.FilterFunction

class MyFilter[ID <: InputData](
                                  threshold: Int
                                ) extends FilterFunction[ID] {
  override def filter(value: ID): Boolean = {
      value.myvalue > threshold
    }
  }
}

Это отлично работает, дело в том, что мне нужно обновлять параметр порога каждый час, потому что это значение может быть изменено моим клиентом.

0
Felipe Jorquera Uribe 27 Янв 2022 в 21:49

2 ответа

Лучший ответ

Возможно, вы можете реализовать интерфейс ProcessingTimeCallback в классе MyFilter, который поддерживает операции таймера, и вы можете обновить порог в функции onProcessingTime.

public class MyFilter extends FilterFunction<...> implements ProcessingTimeCallback { 
    int threshold;

    @Override
    public void open(Configuration parameters) throws Exception {
        scheduler.scheduleAtFixedRate(this, 1, 1, TimeUnit.HOURS);

        final long now = getProcessingTimeService().getCurrentProcessingTime();
        getProcessingTimeService().registerTimer(now + 3600000, this);
    }

    @Override
    public boolean filter(IN xxx) throws Exception {
        return xxx > threshold;
    }

    @Override
    public void onProcessingTime(long timestamp) throws Exception {
        threshold = XXXX;

        final long now = getProcessingTimeService().getCurrentProcessingTime();
        getProcessingTimeService().registerTimer(now + 3600000, this);
    }
}
0
ChangLi 28 Янв 2022 в 11:44
Объект планировщика представляет собой пул потоков, поэтому, например, я могу создать его следующим образом? ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1))
 – 
Felipe Jorquera Uribe
28 Янв 2022 в 22:17

Вы можете превратить FilterFunction в BroadcastProcessFunction и транслировать новые пороговые значения по мере их появления.

0
David Anderson 28 Янв 2022 в 16:29