Flink dashboard version 1.3.2 无法执行 CEP pattern 由 ClassNotFoundException 引起
Unable to execute CEP pattern in Flink dashboard version 1.3.2 which is caused by ClassNotFoundException
我写过这样一个简单的模式
Pattern<JoinedEvent, ?> pattern = Pattern.<JoinedEvent>begin("start")
.where(new SimpleCondition<JoinedEvent>() {
@Override
public boolean filter(JoinedEvent streamEvent) throws Exception {
return streamEvent.getRRInterval()>= 10 ;
}
}).within(Time.milliseconds(WindowLength));
并且它在 IntellijIdea 中执行良好。我在仪表板和 IntelliJ-Idea 中都使用 Flink 1.3.2。当我从源代码构建 Flink 时,我看到了很多警告消息,这让我相信迭代条件 类 没有包含在 jar 中,因为错误也说 ClassNotFoundException
。下面是错误
Caused by: java.lang.NoClassDefFoundError: org/apache/flink/cep/pattern/conditions/IterativeCondition
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at
org.apache.flink.client.program.PackagedProgram.hasMainMethod(PackagedProgram.java:492)
... 38 more
Caused by: java.lang.ClassNotFoundException: org.apache.flink.cep.pattern.conditions.IterativeCondition
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 44 more
经过一整天的努力解决这个问题,我终于得到了解决方案。问题很简单,就是 Flink CEP 不是二进制分发的一部分,所以每当我尝试执行模式时,它都会给我一个错误。
解决方法很简单
如你所见,Flink Binary 没有cep jar。
所以转到你的 IDE,在我的例子中是 IntelliJ 并复制所需的 jar
转到此位置并将此 jar 复制粘贴到二进制版本的 lib 文件夹中。
Yalaa,问题已解决
如果你不想手动添加依赖或者你有一个maven或sbt项目,你可以简单地在.pom文件或对应的sbt文件中添加依赖,并添加以下依赖。
根据项目需要更改flink版本
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-cep_2.11 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-cep_2.11</artifactId>
<version>1.3.2</version>
</dependency>
// https://mvnrepository.com/artifact/org.apache.flink/flink-cep_2.11
libraryDependencies += "org.apache.flink" % "flink-cep_2.11" % "1.3.2"
我写过这样一个简单的模式
Pattern<JoinedEvent, ?> pattern = Pattern.<JoinedEvent>begin("start")
.where(new SimpleCondition<JoinedEvent>() {
@Override
public boolean filter(JoinedEvent streamEvent) throws Exception {
return streamEvent.getRRInterval()>= 10 ;
}
}).within(Time.milliseconds(WindowLength));
并且它在 IntellijIdea 中执行良好。我在仪表板和 IntelliJ-Idea 中都使用 Flink 1.3.2。当我从源代码构建 Flink 时,我看到了很多警告消息,这让我相信迭代条件 类 没有包含在 jar 中,因为错误也说 ClassNotFoundException
。下面是错误
Caused by: java.lang.NoClassDefFoundError: org/apache/flink/cep/pattern/conditions/IterativeCondition
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at
org.apache.flink.client.program.PackagedProgram.hasMainMethod(PackagedProgram.java:492)
... 38 more
Caused by: java.lang.ClassNotFoundException: org.apache.flink.cep.pattern.conditions.IterativeCondition
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 44 more
经过一整天的努力解决这个问题,我终于得到了解决方案。问题很简单,就是 Flink CEP 不是二进制分发的一部分,所以每当我尝试执行模式时,它都会给我一个错误。
解决方法很简单
如你所见,Flink Binary 没有cep jar。
所以转到你的 IDE,在我的例子中是 IntelliJ 并复制所需的 jar
转到此位置并将此 jar 复制粘贴到二进制版本的 lib 文件夹中。
Yalaa,问题已解决
如果你不想手动添加依赖或者你有一个maven或sbt项目,你可以简单地在.pom文件或对应的sbt文件中添加依赖,并添加以下依赖。
根据项目需要更改flink版本
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-cep_2.11 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-cep_2.11</artifactId>
<version>1.3.2</version>
</dependency>
// https://mvnrepository.com/artifact/org.apache.flink/flink-cep_2.11
libraryDependencies += "org.apache.flink" % "flink-cep_2.11" % "1.3.2"