我正尝试在本地模式下在Apache Flink中执行示例程序。
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;
public class WordCountExample {
public static void main(String[] args) throws Exception {
final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
DataSet<String> text = env.fromElements(
"Who's there?",
"I think I hear them. Stand, ho! Who's there?");
//DataSet<String> text1 = env.readTextFile(args[0]);
DataSet<Tuple2<String, Integer>> wordCounts = text
.flatMap(new LineSplitter())
.groupBy(0)
.sum(1);
wordCounts.print();
env.execute();
env.execute("Word Count Example");
}
public static class LineSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String line, Collector<Tuple2<String, Integer>> out) {
for (String word : line.split(" ")) {
out.collect(new Tuple2<String, Integer>(word, 1));
}
}
}
}
它给了我例外:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/mapreduce/InputFormat
at WordCountExample.main(WordCountExample.java:10)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.InputFormat
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 1 more
我做错了什么?
我也使用过正确的罐子。 的弗林克-java的0.9.0-里程碑-1.jar 弗林克的客户端-0.9.0-里程碑,1.jar 弗林克核-0.9.0-里程碑-1.jar
答案 0 :(得分:7)
在项目中添加三个Flink Jar文件作为依赖项是不够的,因为它们具有其他传递依赖性,例如在Hadoop上。
获得开发(和本地执行)Flink程序的工作设置的最简单方法是遵循使用Maven原型配置Maven项目的quickstart guide。可以将此Maven项目导入IDE。
答案 1 :(得分:2)
NoClassDefFoundError扩展了LinkageError
如果Java虚拟机或ClassLoader实例尝试,则抛出该异常 加载类的定义(作为普通方法调用的一部分或 作为使用新表达式创建新实例的一部分)和否 可以找到类的定义。搜索过的课程 编译当前正在执行的类时存在定义, 但无法再找到定义。
你的代码/ jar依赖于hadoop。在此处找到它下载jar文件并将其添加到类路径org.apache.hadoop.mapreduce.InputFormat
中答案 2 :(得分:0)
首先,你项目中包含的flink jar文件是不够的,包括flink下的 lib 文件夹中的所有jar文件源文件夹。
其次, “env.execute(); env.execute(“字数统计示例”);“这些代码行不是必需的,因为您只是将数据集打印到控制台上;您不是将输出写入文件(.txt,.csv)因此,最好删除这些行(如果不需要,有时会抛出错误(很多次观察))
第三,从IDE导出Java项目的jar文件时,不要忘记选择“Main”类。
希望在进行上述更改后,您的代码可以正常运行。