用于CEP示例的简单Scala API不显示任何输出

时间:2016-05-25 11:07:31

标签: scala apache-flink flink-streaming flink-cep

我编写了一个简单的示例,用于在Flink中测试新的Scala API for CEP,使用最新的Github版本1.1-SNAPSHOT。

Pattern只是检查一个值,并输出一个String作为匹配的每个模式的结果。代码如下:

val pattern : Pattern[(String, Long, Int), _] = Pattern.begin("start").where(_._3 < 4)

val cepEventAlert = CEP.pattern(streamingAlert, pattern)

def selectFn(pattern : mutable.Map[String, (String, Long, Int)]): String = {
    val startEvent = pattern.get("start").get
    "Alerta:"+startEvent._1+": Pattern"
}

val patternStreamSelected = cepEventAlert.select(selectFn(_))

patternStreamSelected.print()

它编译并在1.1-SNAPSHOT下运行而没有问题,但是jobmanager输出显示没有print()的迹象。甚至放松模式条件,只设置一个&#34; start&#34; (接受所有事件)绝对没有任何回报。

此外,在尝试添加阶段时,代码无法编译。如果我将模式更改为(在第3个字段小于4的情况下查找两个连续事件):

Pattern.begin("start").where(_._3 < 4).next("end").where(_._3 < 4).within(Time.seconds(30))

然后编译器抛出:

error: missing parameter type for expanded function ((x$4) => x$4._3.$less(4))

显示错误位于&#34; start&#34;之后的第一个位置()阶段。我尝试使用以下方法显式设置参数类型:

(x: (String, Long, Int)) => x._3 < 4

这样它再次编译,但是当它在Flink上运行时,则不显示输出。 StreamingAlert是一个Scala DataStream [(String,Long,Int)],在代码的其他部分,我可以用_._ < 4过滤而没有问题,输出似乎是正确的。

1 个答案:

答案 0 :(得分:1)

流API中的print() API调用不会触发急切执行。您仍然需要在程序结束时致电env.execute()

定义模式时,应在某处提供事件类型。您可以在完成此操作时执行此操作,也可以通过begin的类型参数执行此操作:

Pattern.begin[(String, Long, Int)]("start").where(_._3 < 4).next("end").where(_._3 < 4).within(Time.seconds(30))