繁体   English   中英

hadoop映射器静态初始化

[英]hadoop mapper static initialisation

我有一个代码片段,其中使用了静态代码块来初始化变量。

public static class JoinMap extends 
            Mapper<IntWritable, MbrWritable, LongWritable, IntWritable> {
        .......
        public static RTree rt = null;
        static {
            String rtreeFileName = "R.rtree";
            rt = new RTree(rtreeFileName);
        }
        public void map(IntWritable key, MbrWritable mbr,Context context)
                throws IOException, InterruptedException {
                            .........               
                List elements = rt.overlaps(mbr.getRect());
                .......

        }

    }

我的问题是上述代码片段中的变量rt尚未初始化。 任何人都可以提出修正或初始化变量的替代方法。 我不想在地图函数中初始化它,因为这会使整个过程变慢。

除非Java本身已损坏,否则这实际上是不可能的。 静态初始化程序始终在类加载时触发。

也许您正在观察的内容都有其他解释,例如,将rt设置回null 或者,您是否在上面的其他静态初始化表达式中观察rt rt的初始化完成之前,它将显示为null

但是,尽管如此,我还是想重写setup()方法(旧API中的configure() )并在那里进行初始化。 它只会发生一次。

public static class JoinMap extends 
        Mapper<IntWritable, MbrWritable, LongWritable, IntWritable> {
    .......
    public RTree rt = null; //note that i removed static modifier

    @Override
    public void setup(Context context) throws IOException {
        //this will be executed once on each mapper before first map(..) call
        String rtreeFileName = "R.rtree";
        rt = new RTree(rtreeFileName);
    }

    public void map(IntWritable key, MbrWritable mbr,Context context)
            throws IOException, InterruptedException {
                        .........
    }

}

如果我们不声明一个静态块而只写该怎么办?

public static RTree rt =  new RTree(rtreeFileName);

因为变量是静态的,当类被加载到内存中时,它将被初始化一次吗?

您是否有某些原因不想这样初始化rt?

public static RTree rt = new RTree("R.rtree");

我不是Java专家,但看起来您为变量rt分配了两个“静态”分配:您有:

公共静态RTree rt = null ;

rt =新的RTree(rtreeFileName) ;

这些分配按什么顺序进行?

尝试一下,看看是否有帮助

    public static final RTree rt = new RTree("R.rtree");

就我的Java知识而言,这可以确保您只有一次分配。

您可以覆盖mapper类的setup()方法以初始化与map函数有关的任何内容。 在每个映射器的开头,只会调用一次setup()方法,因此,它不会减慢映射器进程的速度

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM