繁体   English   中英

keyBy是否跨Flink(scala)中的并行任务对DataStream进行分区?

[英]Does keyBy partition the DataStream across parallel tasks in Flink (scala)?

我想在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处理?

而不是一个对象,我相信你应该使用一个状态

具有相同密钥的所有事件将具有对相同值的访问权限。 修改其中一个状态不会影响其他键控状态。

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

这使flink的状态成为本地状态,这使得它易于使用和快速。 计时器还利用了这种键控分区。

使用Flink的键控状态可能比使用缓存对象更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM