Storm 流应用中的侧边模式

v09wglhw  于 2023-09-28  发布在  Apache
关注(0)|答案(1)|浏览(141)

我有一个Spark流应用程序。它获取一批记录并对记录执行多个Map函数。
当.map阶段很少有记录失败时,我希望能够知道失败的原始id/记录,以便我可以将其置于边线并稍后重试。有没有人能在这方面提出建议?把try catch放在每个.map函数上听起来并不可行(如果这是唯一的方法,我应该尝试减少.map函数吗?))
既然像storm和flink这样的其他流媒体框架都达到了创纪录的水平,那么在那里实现边缘化会更容易吗?

63lcw9qa

63lcw9qa1#

使用Flink,你将使用ProcessFunction而不是map,并 Package 可能在try catch中失败的转换。然后将导致异常的记录发送到侧输出。
它看起来像这样:

final OutputTag<String> errors = new OutputTag<>("errors") {};

        final SingleOutputStreamOperator<Event> transformedStream =
                env.fromSource(source, WatermarkStrategy.noWatermarks(), "Source")
                        .process(
                                new ProcessFunction<>() {
                                    @Override
                                    public void processElement(
                                            String value,
                                            ProcessFunction<String, Event>.Context ctx,
                                            Collector<Event> out) {
                                        final Event transformed;
                                        try {
                                            transformed = myTransformation(value);
                                        } catch (IOException e) {
                                            ctx.output(errors, value);
                                            return;
                                        }
                                        out.collect(transformed);
                                    }
                                });

相关问题