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

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

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

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

  1. public static String var="";

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

  1. public class Tester {
  2. public static String var;
  3. public static void main(String args){
  4. var="12345";
  5. //calling mapper by job
  6. }
  7. }

这是我的mapper类代码

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

35g0bw711#

我将假设tester类是hadoop作业驱动程序类。然后您需要执行以下操作:

  1. public class Tester {
  2. public static String var;
  3. public static void main(String args){
  4. var="12345";
  5. .
  6. .
  7. .
  8. Configuration conf = job.getConfiguration();
  9. conf.set("varProp" , var);
  10. .
  11. .
  12. .
  13. }
  14. }
  15. public class MyMapper {
  16. public void map(ByteBuffer key,SortedMap<ByteBuffer, Column> column,Context context)throws IOException,InterruptedException{
  17. //now i want to use var variable here
  18. Configuration conf = context.getConfiguration();
  19. String str = conf.getString("varProp");
  20. }
  21. }

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

  1. public class MyMapper {
  2. public static String var;
  3. @Override
  4. public void setup(Context context) throws IOException,
  5. InterruptedException {
  6. super.setup(context);
  7. var="12345";
  8. }
  9. }
展开查看全部

相关问题