使用用户代码类加载器在flink RichFilterFunction中加载用户类

时间:2018-03-16 12:25:28

标签: apache-flink flink-streaming

我正在尝试使用flink的UserCodeClassLoader,但由于我是Flink的新手,我无法理解如何使用它。

情境: 在RichFilterFunction()的open()方法中,我想加载一个外部jar。

为此,我在open()中执行以下操作:

@Override
public void open(Configuration parameters) throws Exception {
ClassLoader userClassLoader = getRuntimeContext().getUserCodeClassLoader();
URL url = userClassLoader.getResource("/tmp/rohit/FilterTest/FilterTest.jar");
klazz = userClassLoader.loadClass("FilterTest");
Constructor<?> ctor = klazz.getConstructor();
Object obj = ctor.newInstance(new Object[] {});
control = (MyRichFilterInterface)obj; 

...等

但是,我收到了ClassNotFoundException:

Caused by: java.lang.ClassNotFoundException: FilterTest
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at org.apache.flink.runtime.execution.librarycache.FlinkUserCodeClassLoaders$ChildFirstClassLoader.loadClass(FlinkUserCodeClassLoaders.java:128)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at MyRichFilterFunction.open(MyRichFilterFunction.java:24)
        at org.apache.flink.api.common.functions.util.FunctionUtils.openFunction(FunctionUtils.java:36)
        at org.apache.flink.streaming.api.operators.AbstractUdfStreamOperator.open(AbstractUdfStreamOperator.java:102)
        at org.apache.flink.streaming.runtime.tasks.StreamTask.openAllOperators(StreamTask.java:393)
        at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:254)
        at org.apache.flink.runtime.taskmanager.Task.run(Task.java:718)
        at java.lang.Thread.run(Thread.java:748)

我的flink版本是1.4.0&amp;它安装在/root/flink-1.4.0/中 我没有更改特定于此问题的flink配置中的任何参数。

如果有人知道我错过了什么,那就太棒了! 我之前使用过URLClassLoader,但我不确定如何使用Flink提供的UserCodeClassLoader。

0 个答案:

没有答案