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,因此,单个缓存键可能存在于多个 cacheObject 中。但是,我希望有一个特定键的单个缓存条目,也就是说,对应于特定键的所有记录必须由单个实例和单个 cacheObject 处理。将在 myStream 上使用 keyBy(),确保所有具有相同键的传入事件都由 Flink 作业的单个并行 task/instance 处理,因此也由单个 cacheObject?
我认为您应该使用 state 而不是对象。
具有相同键的所有事件都可以访问相同的状态,从而访问相同的值。修改其中一个状态不会影响其他键控状态。
是的,keyBy 保证具有相同键的每个事件都将由运算符的相同实例处理。这对于高吞吐量、低延迟的有状态流处理至关重要。
这使得 flink 的状态是本地的,这使得它易于使用且速度很快。计时器也利用了这种键控分区。
使用 Flink's keyed state 可能比使用缓存对象要好得多。
我想在 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,因此,单个缓存键可能存在于多个 cacheObject 中。但是,我希望有一个特定键的单个缓存条目,也就是说,对应于特定键的所有记录必须由单个实例和单个 cacheObject 处理。将在 myStream 上使用 keyBy(),确保所有具有相同键的传入事件都由 Flink 作业的单个并行 task/instance 处理,因此也由单个 cacheObject?
我认为您应该使用 state 而不是对象。
具有相同键的所有事件都可以访问相同的状态,从而访问相同的值。修改其中一个状态不会影响其他键控状态。
是的,keyBy 保证具有相同键的每个事件都将由运算符的相同实例处理。这对于高吞吐量、低延迟的有状态流处理至关重要。
这使得 flink 的状态是本地的,这使得它易于使用且速度很快。计时器也利用了这种键控分区。
使用 Flink's keyed state 可能比使用缓存对象要好得多。