Apache flink 与flink Parallelism相关的对象实例&;应用方法
首先让我问一下我的问题,然后你能澄清我关于应用方法的假设吗Apache flink 与flink Parallelism相关的对象实例&;应用方法,apache-flink,flink-streaming,Apache Flink,Flink Streaming,首先让我问一下我的问题,然后你能澄清我关于应用方法的假设吗 问题:如果我的应用程序每一分钟创建1.500.000(大约)条记录,flink job使用15++不同的操作符从kafka消费者处读取这些记录,那么这种逻辑可能会产生延迟、背压等。。?(您可以假设并行度为16) 公共类示例{ //op1= 卡夫卡索 .凯比(某物) .时间窗口(时间.分钟(1)) .apply(新的ApplySomething()) .姓名(“姓名”) .addSink(卡夫卡辛银行); //op2= 卡夫卡索 .凯比
公共类示例{
//op1=
卡夫卡索
.凯比(某物)
.时间窗口(时间.分钟(1))
.apply(新的ApplySomething())
.姓名(“姓名”)
.addSink(卡夫卡辛银行);
//op2=
卡夫卡索
.凯比(某物2)
.timeWindow(Time.seconds(1))//假设这一秒
.apply(新的ApplySomething2())
.姓名(“姓名”)
.addSink(卡夫卡辛银行);
// ...
//op16=
卡夫卡索
.凯比(某物16)
.时间窗口(时间.分钟(1))
.apply(新的ApplySomething16())
.姓名(“姓名”)
.addSink(卡夫卡辛银行);
}
// ..
公共类ApplySomething。。。{
私有对象;
私有整数阈值=30,40,100。。。;
@凌驾
公共void open(配置参数)引发异常{
object=新的AnyObject();
}
@凌驾
public void apply(元组、时间窗口、Iterable输入、收集器输出)引发异常{
int计数器=0;
对于(记录每个:输入){
计数器+=each.getValue();
如果(计数器>阈值){
out.collec(each.getResult());
返回;
}
}
}
}
- 如果是,我应该使用带状态的平面地图(rocksDB)而不是时间窗口吗?
- 我的预测是肯定的。让我解释一下为什么我会这样想:
- 如果并行度为16,则indivudual
将有16个不同的实例,并且perApplySomething1()、ApplySomething2()…ApplySomething16()
类将有16个ApplySomething..()
实例AnyObject()
- 当应用程序工作时,如果
分区号大于16(假设我的应用程序每天有1.000.000个不同的keyBy(something)
),那么一些something
实例将处理不同的键,因此一个ApplySomething..()
应在处理之前等待其他循环那么这将产生延迟李>apply()
- 如果并行度为16,则indivudual
.window(TumblingProcessingTimeWindows.of(Time.minutes(1), Time.seconds(15))
(或根据具体情况使用TumblingEventTimeWindows
)。这将创建每分钟15秒后触发的分钟长窗口
只要您的用例允许,您应该使用增量聚合(通过reduce
或aggregate
),而不是使用WindowFunction
(或ProcessWindowFunction
)来收集分配给列表中每个窗口的所有事件,然后再将其作为一种小批量处理
设置关键帧的时间窗口将在RocksDB中保持其状态,前提是您已将RocksDB配置为状态后端。您无需切换到使用RichFlatMap
即可访问RocksDB。(此外,由于flatMap不能使用计时器,我假设您最终会使用进程函数。)
当窗口操作符的任何并行实例忙于执行其窗口函数(其中一个ApplySomethings
)时,您正确地认为该任务不会做任何其他事情,因此它会(除非它很快完成)产生临时反压。您需要根据需要增加并行性,以便作业能够满足吞吐量和延迟的要求