7

我正在尝试以本地模式在 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

我究竟做错了什么?

我也使用了正确的罐子。 flink-java-0.9.0-milestone-1.jar flink-clients-0.9.0-milestone-1.jar flink-core-0.9.0-milestone-1.jar

4

3 回答 3

8

在项目中添加三个 Flink Jar 文件作为依赖项是不够的,因为它们还有其他传递依赖项,例如在 Hadoop 上。

获得工作设置以开发(并在本地执行)Flink 程序的最简单方法是遵循使用 Maven 原型配置 Maven 项目的快速入门指南。可以将这个 Maven 项目导入到您的 IDE 中。

于 2015-06-01T12:05:40.840 回答
2

NoClassDefFoundError 扩展了 LinkageError

如果 Java 虚拟机或 ClassLoader 实例尝试加载类的定义(作为正常方法调用的一部分或作为使用 new 表达式创建新实例的一部分)并且找不到类的定义,则抛出此异常。搜索到的类定义在编译当前执行的类时已经存在,但无法再找到该定义。

您的代码/jar 依赖于 hadoop。在这里找到它下载 jar 文件并将其添加到您的类路径org.apache.hadoop.mapreduce.InputFormat

于 2015-06-01T10:57:23.353 回答
0

首先,您在项目中包含的 flink jar 文件是不够的,包括存在于flink 源文件夹下的 lib文件夹中的所有 jar 文件。

其次, “ env.execute(); env.execute("字数示例");" 这些代码行不是必需的,因为您只是将数据集打印到控制台上;您没有将输出写入文件(.txt、.csv 等)。因此,最好删除这些行(如果不需要,如果包含在代码中,有时会抛出错误(观察了很多次)

第三,在从 IDE 导出 Java 项目的 jar 文件时,不要忘记选择“Main”类。

希望在进行上述更改后,您的代码可以正常工作。

于 2018-05-09T16:38:10.193 回答