hadoop的toorunner线程安全吗?

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

我想同时触发几个hadoop作业。我使用executors.newfixedthreadpool创建了一个线程池。如果池大小为2,我的代码将使用“toolrunner.run”同时触发2个hadoop作业。在我的测试中,我注意到这两个线程一直在互相踩着。
当我在引擎盖下面查看时,我注意到toolrunner创建了genericoptionsparser,它反过来调用静态方法buildgeneraoptions。此方法使用“optionbuilder.withargname”,它使用名为“argname”的示例变量。这看起来不线程安全,我相信是我遇到的问题的根本原因。
有什么想法吗?

luaexgnf

luaexgnf1#

确认toolrunner不是线程安全的:

原始代码(遇到问题):

public static int run(Configuration conf, Tool tool, String[] args) 
throws Exception{
if(conf == null) {
  conf = new Configuration();
}
GenericOptionsParser parser = new GenericOptionsParser(conf, args);
//set the configuration back, so that Tool can configure itself
tool.setConf(conf);

//get the args w/o generic hadoop args
String[] toolArgs = parser.getRemainingArgs();
return tool.run(toolArgs);

}

新代码(有效):

public static int run(Configuration conf, Tool tool, String[] args)
        throws Exception{
    if(conf == null) {
        conf = new Configuration();
    }
    GenericOptionsParser parser = getParser(conf, args);

    tool.setConf(conf);

    //get the args w/o generic hadoop args
    String[] toolArgs = parser.getRemainingArgs();
    return tool.run(toolArgs);
}

private static synchronized GenericOptionsParser getParser(Configuration conf, String[] args) throws Exception {
    return new GenericOptionsParser(conf, args);
}

相关问题