有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java静态变量在可运行jar(hadoop mapreduce)中不起作用

我是hadoop新手。我试图在我的映射器中使用一个静态变量。 我在主类中声明静态变量

public static String var="";

之后,我在main()中给出了一些动态值 var=“123456”; 之后,我在mapper类的map()中使用这个变量

但是它给我带来了空点异常。 当我使用Eclipse时,我能够在具有maven依赖项的普通java核心项目中执行,但当我使其可运行时,jar和 在hadoop服务器上运行它会给我nullPointerException 所以我还是不明白为什么会出现这个例外任何人知道这个请帮助我

提前谢谢

我的主要班级代码

public class Tester {
    public static String var;

    public static void main(String args){
        var="12345";
        //calling mapper by job 
    }
}

这是我的映射器类代码

public class MyMapper {
    public void map(ByteBuffer key,SortedMap<ByteBuffer, Column> column,Context context)throws IOException,InterruptedException{
        //now i want to use var variable here
        String str = Tester.var;
        System.out.println("Variable value   "+str);//this will give me nullPointerException in runnable jar
    }
}

共 (1) 个答案

  1. # 1 楼答案

    我将假定Tester类是Hadoop作业驱动程序类。然后,您需要执行以下操作:

    public class Tester {
     public static String var;
    
     public static void main(String args){
        var="12345";
           .
           .
           .
    
        Configuration conf = job.getConfiguration();
        conf.set("varProp" , var);
           .
           .
           .
     }
    }    
    
    public class MyMapper {
      public void map(ByteBuffer key,SortedMap<ByteBuffer, Column> column,Context   context)throws IOException,InterruptedException{
        //now i want to use var variable here
        Configuration conf = context.getConfiguration();
        String str = conf.getString("varProp");
     }
    }
    

    如果要在映射器本身中初始化变量,则应在override setup()方法中进行初始化(不在main中,因为根本不会调用main方法),如下所示

    public class MyMapper {
    public static String var;
    @Override
    public void setup(Context context) throws IOException,
            InterruptedException { 
            super.setup(context);
            var="12345";
      }
    }