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= 卡夫卡索 .凯比

首先让我问一下我的问题,然后你能澄清我关于应用方法的假设吗

  • 问题:如果我的应用程序每一分钟创建1.500.000(大约)条记录,flink job使用15++不同的操作符从kafka消费者处读取这些记录,那么这种逻辑可能会产生延迟、背压等。。?(您可以假设并行度为16)

  • 公共类示例{
    //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
        ApplySomething1()、ApplySomething2()…ApplySomething16()
        将有16个不同的实例,并且per
        ApplySomething..()
        类将有16个
        AnyObject()
        实例
      • 当应用程序工作时,如果
        keyBy(something)
        分区号大于16(假设我的应用程序每天有1.000.000个不同的
        something
        ),那么一些
        ApplySomething..()
        实例将处理不同的键,因此一个
        apply()
        应在处理之前等待其他循环那么这将产生延迟

    Flink的时间窗口与历元对齐(例如,如果您有一组小时窗口,它们都将在小时触发)。因此,如果您确实希望在您的作业中有一组不同的窗口,那么您应该将它们配置为具有不同的偏移量,这样它们就不会同时被触发。这样做会分散负载。看起来像这样

    .window(TumblingProcessingTimeWindows.of(Time.minutes(1), Time.seconds(15))
    
    (或根据具体情况使用
    TumblingEventTimeWindows
    )。这将创建每分钟15秒后触发的分钟长窗口

    只要您的用例允许,您应该使用增量聚合(通过
    reduce
    aggregate
    ),而不是使用
    WindowFunction
    (或
    ProcessWindowFunction
    )来收集分配给列表中每个窗口的所有事件,然后再将其作为一种小批量处理

    设置关键帧的时间窗口将在RocksDB中保持其状态,前提是您已将RocksDB配置为状态后端。您无需切换到使用
    RichFlatMap
    即可访问RocksDB。(此外,由于flatMap不能使用计时器,我假设您最终会使用进程函数。)

    当窗口操作符的任何并行实例忙于执行其窗口函数(其中一个
    ApplySomethings
    )时,您正确地认为该任务不会做任何其他事情,因此它会(除非它很快完成)产生临时反压。您需要根据需要增加并行性,以便作业能够满足吞吐量和延迟的要求