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

ztmd8pv5  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(406)

这个问题在这里已经有答案了

hadoop map reduce引用静态对象(3个答案)
6年前关门了。
我是hadoop新手。我试图在Map器中使用静态变量。我在主类中声明静态变量

public static String var="";

之后,我在main()var=“123456”中给出一些动态值;在这之后,我在mapper类的map()中使用这个变量
但它给了我nullpointerexception。当我使用eclipse时,我能够在普通的java核心项目中执行maven依赖项,但是当我使它可以运行jar并且在hadoop服务器上运行时,它会给我nullpointerexception,所以我仍然不明白为什么它会给这个异常任何人知道这个请帮助我
提前谢谢
我的主类代码

public class Tester {
    public static String var;

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

这是我的mapper类代码

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
    }
}
35g0bw71

35g0bw711#

我将假设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");
 }
}

如果要在Map器本身中初始化变量,应该在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";
  }
}

相关问题