Flink CEP select()函数无法正常运行

时间:2018-08-30 11:37:16

标签: java apache-flink complex-event-processing

我正在尝试使用CEP Flink库开发一个简单的监视过程。我从Kafka生成一个csv文件,并通过Flink进行使用,它将是一个Tuple4。

直到此处一切正常。 Flink使用者可以完美地使用来自Kafka的数据并将其转换为Tuple4。然后,我为Datastream对象创建Pattern,PatternStream和最后的select()函数。

显然,一切正常,但是不起作用。 select()函数出了点问题。

我还创建了一个POJO来接收最终值。我添加两个代码。谢谢。

public class LTMonitoringTest {
private static final int LEUKO = 3500;

public static void main(final String[] ARGS) throws Exception{
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
    env.enableCheckpointing(1000);



    ParameterTool parameterTool = ParameterTool.fromArgs(ARGS);

    DataStreamSource<String> myConsumer = env.addSource(new FlinkKafkaConsumer082<>
            (parameterTool.getRequired("topic"), new SimpleStringSchema(),
                    parameterTool.getProperties()));


    DataStream<Tuple4<Integer, Integer, Integer, Long>> streamTuple = myConsumer
            .map(new csv2Tuple())
            .assignTimestampsAndWatermarks(new ExtractTimestamp());

    streamTuple.print();

    Pattern<Tuple4<Integer, Integer, Integer, Long>, ?> warningPattern =
            Pattern.<Tuple4<Integer, Integer, Integer, Long>>
            begin("first")
            .where(new IterativeCondition<Tuple4<Integer, Integer, Integer, Long>>() {
                @Override
                public boolean filter(Tuple4<Integer, Integer, Integer, Long> value,
                                      Context<Tuple4<Integer, Integer, Integer, Long>> ctx)
                        throws Exception {
                    return value.f1 <= LEUKO;
                }
            });

    PatternStream<Tuple4<Integer, Integer, Integer, Long>> tempPatternStream = CEP.pattern(
            streamTuple.keyBy(0),
            warningPattern);


    DataStream<Warning> warnings1 = tempPatternStream.select(
            (Map<String, List<Tuple4<Integer, Integer, Integer, Long>>> pattern) -> {
                Tuple4<Integer, Integer, Integer, Long> first =
                        (Tuple4<Integer, Integer, Integer, Long>) pattern.get("first").get(0);

                return new Warning(first.f0, first.f1);
            }
    );

    warnings1.print();
    env.execute("CEP monitoring job");
}

private static class ExtractTimestamp extends
        AscendingTimestampExtractor<Tuple4<Integer, Integer, Integer, Long>> {

    @Override
    public long extractAscendingTimestamp(Tuple4<Integer, Integer, Integer, Long> element) {
        return element.f3;
    }
}


public static class csv2Tuple implements MapFunction<String,
        Tuple4<Integer, Integer, Integer, Long>> {
    @Override
    public Tuple4<Integer, Integer, Integer, Long> map(String str) {
        String[] temp = str.split(",");
        return new Tuple4<>(
                Integer.parseInt(temp[0]),
                Integer.parseInt(temp[1]),
                Integer.parseInt(temp[2]),
                Long.parseLong(temp[3]));

    }

}

}

它作为加料收到(对于kafka konsumer):

  

-topic lt-monitoring --bootstrap.servers localhost:9092 --zookeeper.connect localhost:2181 --group.id myGroup

还有POJO:

public class Warning {

private int ID;
private int Level;

public Warning(int ID, int Level) {
    this.ID = ID;
    this.Level = Level;
}


/**
 * Sets new ID.
 *
 * @param ID New value of ID.
 */
public void setID(int ID) {
    this.ID = ID;
}

/**
 * Gets ID.
 *
 * @return Value of ID.
 */
public int getID() {
    return ID;
}

/**
 * Gets Level.
 *
 * @return Value of Level.
 */
public int getLevel() {
    return Level;
}

/**
 * Sets new Level.
 *
 * @param Level New value of Level.
 */
public void setLevel(int Level) {
    this.Level = Level;
}

@Override
public boolean equals(Object obj) {
    if (obj instanceof Warning) {
        Warning other = (Warning) obj;

        return ID == other.ID && Level == other.Level;
    } else {
        return false;
    }
}

@Override
public int hashCode() {
    return 41 * ID + Double.hashCode(Level);
}

@Override
public String toString() {
    return "Warning{" +
            "ID=" + ID + getID() +
            ", Level=" + Level +
            '}';
}

}

那么请问为什么它不运行?

这是错误:

  

线程“主”中的异常java.lang.NoSuchMethodError:org.apache.flink.api.java.typeutils.TypeExtractor.getUnaryOperatorReturnType(Lorg / apache / flink / api / common / functions / Function; Ljava / lang / Class ; II [I [ILorg / apache / flink / api / common / typeinfo / TypeInformation; Ljava / lang / String; Z)Lorg / apache / flink / api / common / typeinfo / TypeInformation;       在org.apache.flink.cep.PatternStream.select(PatternStream.java:96)       在LTMonitoringTest.main(LTMonitoringTest.java:78)

0 个答案:

没有答案