实例化Jackson对象映射器时出现Flink错误

时间:2019-07-04 13:34:25

标签: java apache-flink

我是Flink的新手,遇到了我不理解的奇怪行为。

这是我的代码的基本示例:

ObjectMapper objectMapper = new ObjectMapper();
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

env.addSource(MY_KAFKA_SOURCE)
   .map(m -> {
       String myStr = objectMapper.writeValueAsString(m);
       return myStr.getBytes();
   })
   .addSink(MY_ELASTICSEARCH_SINK);

try {
    env.execute();
}catch (Exception e){
    LOGGER.error(e.getMessage());
}

这样做时,我的代码可以在本地正常工作。但是,当我尝试通过Flink Web仪表板在Flink群集上运行它时,出现以下错误(仅此而已):

org.apache.flink.client.program.ProgramInvocationException: The program caused an error: 

经过一些测试,我发现了我不知道如何解释的两件事:

  • 即使初始化new ObjectMapper();时也始终没有此错误。 (如果我删除了ObjectMapper,则代码可以正常运行,但是我需要它:))
  • 当我在map函数中声明ObjectMapper时,代码运行良好。

在我的代码中,我还有一个在另一个类中声明的自定义Map函数,其使用方式如下:

public class MyCustomFunction implements MapFunction<Row, Map<String, Object>> {
    @SuppressWarnings("unchecked")
    public CustomRowToMapFunction() {
        // Do something
    }

    @Override
    @SuppressWarnings("unchecked")
    public Map<String, Object> map(Row elt) throws Exception {
        // Do something
    }
}

env.addSource(MY_KAFKA_SOURCE)
   .map(new MyCustomFunction())
   .map(m -> {
       String myStr = objectMapper.writeValueAsString(m);
       return myStr.getBytes();
   })
   .addSink(MY_ELASTICSEARCH_SINK);

以与以前相同的方式,如果我在构造函数中初始化new ObjectMapper();,即使不使用它,或者仅在构造函数中不使用它,我也会得到Flink错误。如果我在map()函数中初始化ObjectMapper,则不会出错。

如您所知,我对此有些迷惑。如果有人对这里发生的事情有想法或解释?

注意:

  • 我正在使用Flink 1.7.2(尝试过Flink 1.8.0)
  • ObjectMapper来自FasterXML Jackson Core 2.9.9

0 个答案:

没有答案