我正在使用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
。如何减少它并获取批处理数据列表并仅刷新一次到数据库?
答案 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)。