Apachespark:-nullpointer exception 广播变量(Yarn簇模式)

91zkwejq  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(343)

我有一个简单的spark应用程序,我试图在yarn cluster上广播一个string类型的变量。但是每次我试图访问广播的ed变量值时,我都会在任务中得到null。如果你们能告诉我,我做错了什么,这真的很有帮助。我的代码是follows:-

public class TestApp implements Serializable { 
  static Broadcast<String[]> mongoConnectionString; 

  public static void main( String[] args ) { 
    String mongoBaseURL = args[0]; 
    SparkConf sparkConf =  new SparkConf().setAppName(Constants.appName); 
    JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf); 

    mongoConnectionString = javaSparkContext.broadcast(args); 

    JavaSQLContext javaSQLContext = new JavaSQLContext(javaSparkContext); 

    JavaSchemaRDD javaSchemaRDD = javaSQLContext.jsonFile(hdfsBaseURL+Constants.hdfsInputDirectoryPath); 

    if(javaSchemaRDD!=null) { 
      javaSchemaRDD.registerTempTable("LogAction"); 
      javaSchemaRDD.cache(); 
      pageSchemaRDD = javaSQLContext.sql(SqlConstants.getLogActionPage); 
      pageSchemaRDD.foreach(new Test());     
    } 
  } 

  private static class Test implements VoidFunction<Row> { 
    private static final long serialVersionUID = 1L; 

    public void call(Row t) throws Exception { 
      logger.info("mongoConnectionString "+mongoConnectionString.value()); 
    } 
  } 
}
y3bcpkx1

y3bcpkx11#

这是因为广播变量在类级别。因为当类在worker节点中初始化时,它将看不到您在main方法中分配的值。它只会看到一个空值,因为广播变量没有初始化为任何值。我找到的解决方案是在调用方法时将广播变量传递给方法。蓄能器也是如此

相关问题