keyBy是否在Flink(scala)中的并行任务之间划分DataStream?

时间:2019-04-04 17:41:21

标签: scala parallel-processing guava apache-flink flink-streaming

我想在Flink中的输入数据流上应用ProcessFunction(),以使用单个缓存对象处理每个传入元素。我的代码看起来像这样:

object myJob extends FlinkJob {
 private val myCache = InMemoryCache()

 private def updateCache(myCache,someValue) : Boolean = {//some code}

 private def getValue(myCache,someKey) : Boolean = {//some code}

 def run(params, executionEnv) : Unit = {
   val myStream = executionEnv.getStream()

   val processedStream = myStream.process(new ProcessFunction {
     def processElement(value,context,collector) : Unit = {
      //Update cache
      //Collect updated event
     }
   }

   processedStream.write()
 }
}

当我并行化此作业时,我假设该作业的每个并行实例将具有其自己的cacheObject,因此,在多个cacheObjects中可以存在一个缓存键。但是,我希望特定键只有一个缓存条目,也就是说,对应于特定键的所有记录必须由单个实例和单个cacheObject处理。是否将在myStream上使用keyBy()确保所有具有相同密钥的传入事件都由Flink作业的单个并行任务/实例处理,因此也由单个cacheObject处理?

2 个答案:

答案 0 :(得分:0)

我相信您应该使用state而不是对象。

所有具有相同键的事件都将有权访问相同状态,从而具有相同的值。修改其中一个状态不会影响其他键控状态。

答案 1 :(得分:0)

是的,keyBy保证具有相同键的每个事件将由运算符的相同实例处理。这对于高吞吐量,低延迟的有状态流处理至关重要。

这使flink的状态成为本地状态,从而使其易于使用且速度很快。计时器也利用了这种键分区。

使用Flink's keyed state可能比使用缓存对象要好得多。

相关问题