检查点时出现CEP问题。“找不到条目ID

时间:2017-09-15 18:00:27

标签: apache-flink complex-event-processing

当打开检查点时,简单的CEP循环模式

 private Pattern<Tuple2<Integer, SimpleBinaryEvent>, ?> alertPattern = Pattern.<Tuple2<Integer, SimpleBinaryEvent>>begin("start").where(checkStatusOn)
        .followedBy("middle").where(checkStatusOn).times(2)
        .next("end").where(checkStatusOn).within(Time.minutes(5))

我看到了失败。

SimpleBinaryEvent是

public class SimpleBinaryEvent implements Serializable {

private int id;
private int sequence;
private boolean status;
private long time;

public SimpleBinaryEvent(int id, int sequence, boolean status , long time) {
    this.id = id;
    this.sequence = sequence;
    this.status = status;
    this.time = time;
}
public int getId() {
    return id;
}
public int getSequence() {
    return sequence;
}
public boolean isStatus() {
    return status;
}
public long getTime() {
    return time;
}
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    SimpleBinaryEvent that = (SimpleBinaryEvent) o;

    if (getId() != that.getId()) return false;
    if (isStatus() != that.isStatus()) return false;
    if (getSequence() != that.getSequence()) return false;
    return getTime() == that.getTime();
}

@Override
public int hashCode() {
    //return Objects.hash(getId(),isStatus(), getSequence(),getTime());
    int result = getId();
    result = 31 * result + (isStatus() ? 1 : 0);
    result = 31 * result + getSequence();
    result = 31 * result + (int) (getTime() ^ (getTime() >>> 32));
    return result;
}

@Override
public String toString() {
    return "SimpleBinaryEvent{" +
            "id='" + id + '\'' +
            ", status=" + status +
            ", sequence=" + sequence +
            ", time=" + time +
            '}';
}

}

失败原因:

Caused by: java.lang.Exception: Could not materialize checkpoint 2 for operator KeyedCEPPatternOperator -> Map (1/1).
... 6 more
Caused by: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Could not find id for entry: SharedBufferEntry(ValueTimeWrapper((1,SimpleBinaryEvent{id='1', status=true, sequence=95, time=1505503380000}), 1505503380000, 0),....

我确信我已经按照应有的方式实现了equals()和hashCode()。我也尝试过Objects.hashCode。在其他实例中,我在SharedBuffer.toString()上有了CircularReference(以及stackOverflow),它再次指向引用的问题(相等而不是)。如果没有打开检查点,它会按预期工作。我在本地群集上运行。 CEP生产准备好了吗?

我正在使用1.3.2 Flink

1 个答案:

答案 0 :(得分:0)

非常感谢您尝试使用该库并报告此内容!

随着越来越多的功能被添加到库中,该库正在积极开发中。 1.3是具有如此丰富语义的库的第一个版本,因此我们期望看到1)人们如何使用它以及2)是否存在任何错误。所以我会说它不是100%生产就绪,但它已经不远了。

现在针对手头的问题,我想你正在使用RocksDB进行检查点,对吧?我假设的原因是使用RocksDB,在每个水印(事件时间)中反序列化必要的状态(例如NFA),处理一些事件,然后在将它放回RocksDB之前再次序列化。

对于文件系统状态后端,情况并非如此,您只能在检查点上序列化状态并读取它并仅在恢复时反序列化它。所以在这种情况下,假设您说没有检查点,您的工作就可以正常工作,那么只有在从失败中恢复之后才能看到这个问题。

问题的根源可能是equals() / hashcode()有问题(似乎不是这种情况),或者我们序列化/反序列化CEP的方式存在问题状态。

您是否还可以提供最小的输入事件序列来实现这一目标?这对于重现问题非常有帮助。

非常感谢, 科斯塔斯