Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何计算有多少;“客户”;是否处于基于状态更改事件的分布式flink状态?I';d需要有状态的对象_Java_Apache Flink_Flink Streaming_Stream Processing - Fatal编程技术网

Java 如何计算有多少;“客户”;是否处于基于状态更改事件的分布式flink状态?I';d需要有状态的对象

Java 如何计算有多少;“客户”;是否处于基于状态更改事件的分布式flink状态?I';d需要有状态的对象,java,apache-flink,flink-streaming,stream-processing,Java,Apache Flink,Flink Streaming,Stream Processing,我正在使用kafka->flink->elastic search在java中进行poc项目 在卡夫卡上,将产生数量不可预测的事件,从0到数千事件/秒,例如特定主题 {"gid":"abcd-8910-2ca4227527f9", "state":"stateA", "timestamp:1465566255, "other unusefull info":"..."} Flink将使用此事件,并应每秒搜索每个状态中的事件数,例如: {"stateA":54, "stateB":100, .

我正在使用kafka->flink->elastic search在java中进行poc项目

在卡夫卡上,将产生数量不可预测的事件,从0到数千事件/秒,例如特定主题

{"gid":"abcd-8910-2ca4227527f9", "state":"stateA", "timestamp:1465566255, "other unusefull info":"..."} 
Flink将使用此事件,并应每秒搜索每个状态中的事件数,例如:

{"stateA":54, "stateB":100, ... "stateJ":34}
我有10个州:
[创建,…,删除]
,平均生命周期为15分钟。状态每秒可以更改两次。理论上可以增加新的国家

为了每时每刻都让溪流下沉,我想用弗林克的时间窗

问题是,我需要有状态对象,其中包含关于
guid->previous state
stateX->count
的信息,以便在新事件发生时增加/减少计数

我找到了一份关于有状态蒸汽处理的文件草稿

我是flink和流处理的新手,我还没有深入研究flink有状态流处理。对于第一个阶段,我考虑使用静态对象,但是当几个flink实例启动时,这种方法将不起作用

我想问你:

  • 你认为这种方法怎么样
  • flink适合这种流处理吗
  • 你解决这个问题的方法是什么
  • 另外,我也很欣赏一些窗口有状态流解决方案(或其他解决方案)的代码片段


    谢谢,

    像下面这样的东西怎么样

    它使用15分钟的窗口,之后将清除窗口状态。它还使用每秒计算一次窗口的自定义触发器。就窗口操作而言,有一个reduce函数只保留每个guid的最新状态,还有一个WindowFunction发出(state,1)元组。然后,我们按这个状态输入密钥并求和。我想这会给你你想要的结果

    val env = StreamExecutionEnvironment.getExecutionEnvironment()
    val stream = env.addSource(new FlinkKafkaProducer(...))
    
    val results = stream
      .keyBy(_.guid)
      .timeWindow(Time.minutes(15))
      .trigger(ProcessingTimeTriggerWithPeriodicFirings(1000))
      .apply(
        (e1, e2) => e2,
        (k, w, i, c: Collector[(String, Long)]) => {
          if (i.head != null) c.collect((i.head.state, 1))
        }
      )
      .keyBy(0)
      .timeWindow(Time.seconds(1))
      .sum(1)
      .addSink(new ElasticsearchSink<>(...))
    
    env.execute("Count States")
    
    object ProcessingTimeTriggerWithPeriodicFirings {
      def apply(intervalMs: Long) = {
        new ProcessingTimeTriggerWithPeriodicFirings(intervalMs)
      }
    }
    
    class ProcessingTimeTriggerWithPeriodicFirings(intervalMs: Long)
      extends Trigger[Event, TimeWindow] {
    
      private val startTimeDesc =
        new ValueStateDescriptor[Long]("start-time", classOf[Long], 0L)
    
      override def onElement(element: Event, timestamp: Long, window: TimeWindow, ctx: TriggerContext): TriggerResult = {
        val startTime = ctx.getPartitionedState(startTimeDesc)
        if (startTime.value == 0) {
          startTime.update(window.getStart)
          ctx.registerProcessingTimeTimer(window.getEnd)
          ctx.registerProcessingTimeTimer(System.currentTimeMillis() + intervalMs)
        }
        TriggerResult.CONTINUE
      }
    
      override def onProcessingTime(time: Long, window: TimeWindow, ctx: TriggerContext): TriggerResult = {
        if (time == window.getEnd) {
          TriggerResult.PURGE
        }
        else {
          ctx.registerProcessingTimeTimer(time + intervalMs)
          TriggerResult.FIRE
        }
      }
    
      override def onEventTime(time: Long, window: TimeWindow, ctx: TriggerContext): TriggerResult = {
        TriggerResult.CONTINUE
      }
    }