本文共 1230 字,大约阅读时间需要 4 分钟。
运行环境:虚拟机,Ubuntu16,Ubuntu Server 做Hadoop集群(一主两从),编程软件eclipse。
集群搭建和eclipse环境配置没有问题,其他的MapReduce程序可以正常运行,在运行某一程序时出现
java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: weatherMax.Weather$WeatherMapper.<init>()
没有匹配的Mapper和Reduce方法。
试了很多方法,最后发现是自己的主类中定义Mapper函数和Reduce函数时候是按public class定义的:
public class WeatherMapper extends Mapperpublic class WeatherReduce extends Reducer
随后改为 private static class,再次运行,程序正常。难道是Java语法问题吗,我做了一下尝试:
public class PersonDemo{ public static void main(String args[]){ System.out.println("hi"); } class XiaoBai {} //正确 public class XiaoHei {} //正确}class XiaoBai2 {} //正确public class XiaoHei2 {} //错误,error: class XiaoHei is public, should be declared in a file named XiaoHei.java//由于Java程序里面每个类都会生成一个 .class 文件,上面四个类对应的生成 .class 文件如下,在主类中定义的//类会用 “$” 符号表,如下://Person.class PersonDemo.class PersonDemo.java PersonDemo$XiaoBai2.class PersonDemo$XiaoHei2.class从上面可以看出来, Java程序中只要求:
同一个java文件(就是一个后缀为java的文本)只能有一个pulic class 如果向使用多个class 有两中办法 1 在你的java文件里的public class类外面写class类 前面不能加public
2 在你的java文件里的public class类里面写public class类作为成员
Java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类 ,具体参考见如下链接:
结论:Hadoop程序中的Mapper类和Reduce类的定义使用private static,至于为什么,以后深入研究以后再来填坑吧!
转载地址:http://intii.baihongyu.com/