我是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函数,其使用方式如下:
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,则不会出错。
如您所知,我对此有些迷惑。如果有人对这里发生的事情有想法或解释?
注意: