Flink应用程序抛出IterativeCondition的实现不可序列化

时间:2018-12-12 12:25:37

标签: java apache-flink flink-cep

我正在尝试运行我创建的flink应用程序,由于某种原因,错误会出现

The implementation of the IterativeCondition is not serializable. The object probably contains or references non serializable fields.
    org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:99)
    org.apache.flink.cep.pattern.Pattern.where(Pattern.java:153)
    com.agt.engine.PatternCreator.initialEventPattern(PatternCreator.java:94)
    com.agt.engine.EventSequence.createPatternSequence(EventSequence.java:38)
    com.agt.MainRun.main(MainRun.java:49)

initialEventPattern看起来像这样

  public Map<String, Pattern> initialEventPattern(EventPattern event, Map<Integer, VariableFilter> variableFilterCondition ) throws Exception {
    Map<String, Pattern> beginPatternMap = new HashMap<>();
    String patternName = "start";
    Method beginMethod = this.patternClass.getDeclaredMethod("begin", String.class, AfterMatchSkipStrategy.class);
    Object inst = beginMethod.invoke(new GraphMap(), patternName, this.afterMatchSkipStrategy);
    Pattern beginPattern = ((Pattern) inst).where(new IterativeCondition<GraphMap>() {
        @Override
        public boolean filter(GraphMap graphMap, Context<GraphMap> context) throws Exception {
            getPatternVariables(event);
            return filterVariables(graphMap, event.getSubject(), event.getPredicate()) &&
                    filterTriples(graphMap, event.getSubject());
        }
    });

我在开发此错误时已经看到此错误。但是我能够通过使必要的类可序列化或使迭代条件内的函数为静态来消除此问题。我正在尝试使用java反射动态创建flink模式(Flink-CEP)。 直到现在,我还是直接从主类运行flink环境。它运行良好,并且到现在为止已经足够了,因为我只是看到运行发生时创建的日志。但是现在我试图在flink中部署它,并在Apache flink仪表板中查看一些指标。我试图这样做(我已经开始使用flink(1.6.0),我也在mypom.xml中也使用flink-1.6.0)

bin/flink run -c com.sample.MainRun /path/to/target/flink-extension-1.0.jar

出现上述错误。这似乎很奇怪,因为我可以通过运行主类从IDE中运行它。但是,当我打包它(MVN清洁包)并在flink上运行它时,我得到了可序列化的错误。

任何帮助将不胜感激。目前,我有点处境艰难。

谢谢。

0 个答案:

没有答案