java - Hadoop中的KeyValueTextInputFormat.class异常

标签 java eclipse apache maven hadoop

我使用Maven插件在Eclipse中使用hadoop,
我尝试做链式 map 简化功能,在第二张 map 中
KeyValueTextInputFormat.class作为输入文件类,而不是TextInputFormat.class。因为我想将“文本”作为键传递给 map ,而不是LongWritable。
当我这样做时,遇到了这个异常,我尝试了所有在stackoverflow中找到它的解决方案。

Exception in thread "main" java.lang.IncompatibleClassChangeError: Found class org.apache.hadoop.mapreduce.JobContext, but interface was expected
    at org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat.isSplitable(KeyValueTextInputFormat.java:52)
    at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:246)
    at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:885)

驱动程序类:
Configuration conf = new Configuration(true);

    // Create job1
    Job job1 = new Job(conf, "job1");
    job1.setJarByClass(Mapper1.class);
    job1.setMapperClass(Mapper1.class);
    job1.setMapOutputKeyClass(ByteWritable.class);
    job1.setMapOutputValueClass(RowNumberWritable.class);
    job1.setReducerClass(Reducer1.class);
    job1.setNumReduceTasks(1);
    job1.setOutputKeyClass(Text.class);
    job1.setOutputValueClass(Text.class);
    FileInputFormat.addInputPath(job1, inputPath);
    job1.setInputFormatClass(TextInputFormat.class);
    Path path1 = new Path(out1);
    FileOutputFormat.setOutputPath(job1, path1);
    job1.setOutputFormatClass(TextOutputFormat.class);
    // Delete output if exists
    FileSystem hdfs = FileSystem.get(conf);
    if (hdfs.exists(countedPath))
        hdfs.delete(countedPath, true);

    // Execute the job1
    int code = job1.waitForCompletion(true) ? 0 : 1;

    // Create job2
    Job job2 = new Job(conf, "WordPerDocument");
    job2.setJarByClass(Mapper2.class);
    job2.setMapperClass(Mapper2.class);
    job2.setMapOutputKeyClass(WordDocumentWritable.class);
    job2.setMapOutputValueClass(Text.class);
    job2.setReducerClass(Reducer2.class);
    job2.setOutputKeyClass(Text.class);
    job2.setOutputValueClass(Text.class);
    FileInputFormat.addInputPath(job2, path1);
    job2.setInputFormatClass(KeyValueTextInputFormat.class);
    Path path2 = new Path(ou2);
    FileOutputFormat.setOutputPath(job2, path2);
    job2.setOutputFormatClass(TextOutputFormat.class);

    code = job2.waitForCompletion(true) ? 0 : 1;

我的进口是:
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.ByteWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

请,如果现在有人对这个疯狂的异常(exception)有任何想法:(
谢谢大家

最佳答案

我怀疑此错误是由此行引起的

FileOutputFormat.setOutputPath(job2, path2);
job2Job对象,不属于该对象。.您应该使用TextOutputFormat.class或类似的东西

关于java - Hadoop中的KeyValueTextInputFormat.class异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42284550/

相关文章:

java - 如何在构建时防止 SLF4J 臭名昭著的 "multiple bindings"警告?

Java DOM XML 解析::获取元素属性值

java - 如何在编辑器上创建弹出菜单,使其仅在 Package Explorer View 处于 Activity 状态时出现

java - 单独的接口(interface)和实现 emf ecore

apache - 同一个 docker 容器上的多个虚拟主机

java - 使用不同的唯一 id 提高每个线程的性能

java - 如何使用我的 install.jar 安装 mysql?

java - 在 Tomcat 中启用 Context reload ="true"时,JDBC 连接池连接不足

apache - Tomcat 7 部署的 Web 应用程序 404 状态

php - 使用 PHP 和 Apache 的 NTLM 登录