如何刷新批处理数据以沉入Apache Flink

时间:2020-04-10 10:28:12

标签: apache-flink

我正在使用apache flink(v1.10.0)计算RabbitMQ消息,将结果存储到MySQL,现在我是这样计算的:

consumeRecord.keyBy("gameType")
                .timeWindowAll(Time.seconds(5)).reduce(new ReduceFunction<ReportPump>() {
                    @Override
                    public ReportPump reduce(ReportPump d1, ReportPump d2) throws Exception {
                        d1.setRealPumpAmount(d1.getRealPumpAmount() + d2.getRealPumpAmount());
                        d1.setPumpAmount(d1.getPumpAmount() + d2.getPumpAmount());
                        return d1;
                    }
                })
                .apply(new AllWindowFunction<ReportPump, List<ReportPump>, TimeWindow>() {
                    @Override
                    public void apply(TimeWindow window, Iterable<ReportPump> values, Collector<List<ReportPump>> out) throws Exception {
                        ArrayList<ReportPump> employees = Lists.newArrayList(values);
                        if (employees.size() > 0) {
                            out.collect(employees);
                        }
                    }
                })
                .addSink(new SinkFunction<List<ReportPump>>() {
                    @Override
                    public void invoke(List<ReportPump> value, Context context) throws Exception {
                        PumpRealtimeHandler.invoke(value);
                    }
                });

但是现在接收器方法每次调用仅获得一行,如果该批处理中的某行失败,则无法回滚该批处理操作。现在,我想获取一个窗口的批处理,如果失败则接收到数据库一次,我回滚了插入和Apache Flink的检查点。这是我现在想要做的:

Cannot resolve method 'apply' in 'SingleOutputStreamOperator'

,但是apply函数给出提示:@JsonValue。如何减少它并获取批处理数据列表并仅刷新一次到数据库?

1 个答案:

答案 0 :(得分:1)

SingleOutputStreamOperator没有apply方法,因为apply仅在窗口化之后才能发出。 您在这里想念的是:

learning_rate_init

在reduce和apply之间,它将所有缩减的结果聚合到一个包含所有reduce结果的列表的全局窗口中,然后您可以针对数据库而不是多个批次进行收集。


我不知道您的结果是否是一个好的做法,因为您将失去apache flink的并行性。

您应该阅读有关TableApi和JDBC接收器的信息,也许会对您有所帮助。 (有关更多信息,请点击此处:https://ci.apache.org/projects/flink/flink-docs-stable/dev/table/connect.html#jdbc-connector)。