如何正确处理自定义MapFunction中的错误?

时间:2016-03-18 13:27:13

标签: apache-flink

我为Apache Flink流程实现了MapFunction。它正在解析传入的元素并将它们转换为其他格式,但有时会出现错误(即传入的数据无效)。

我看到了两种可能的处理方式:

  • 忽略无效元素,但似乎我无法忽略错误,因为对于任何传入元素,我必须提供传出元素。
  • 将传入的元素拆分为有效且无效,但似乎我应该使用其他功能。

所以,我有两个问题:

  1. 如何在MapFunction
  2. 中正确处理错误
  3. 如何正确实现此类转换功能?

2 个答案:

答案 0 :(得分:7)

您可以使用FlatMapFunction代替MapFunction。这将允许您仅在元素有效时才发出元素。以下显示了一个示例实现:

input.flatMap(new FlatMapFunction<String, Long>() {
    @Override
    public void flatMap(String input, Collector<Long> collector) throws Exception {
        try {
            Long value = Long.parseLong(input);
            collector.collect(value);
        } catch (NumberFormatException e) {
            // ignore invalid data
        }
    }
});

答案 1 :(得分:1)

这是建立在@Till Rohrmann的想法之上。将其添加为答案而不是注释,以便更好地进行格式化。

我认为实现“split + select”的一种方法是使用带有SideOutput的ProcessFunction。我的图表看起来像这样:

Source --> ValidateProcessFunction ---good data--> UDF--->SinkToOutput
                                    \
                                     \---bad data----->SinkToErrorChannel

这会有用吗?还有更好的方法吗?