【问题标题】:Apache SPARK:-Nullpointer Exception on broadcast variables (YARN Cluster mode)Apache SPARK:-广播变量上的 Nullpointer 异常(YARN 集群模式)
【发布时间】:2015-05-06 17:00:05
【问题描述】:

我有一个简单的 spark 应用程序,我试图在 YARN 集群上广播一个字符串类型的变量。 但是每次我尝试访问广播变量 value 时,我都会在任务中得到空值。如果你们能提出建议,这将非常有帮助,我在这里做错了什么。 我的代码如下:-

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()); 
    } 
  } 
}

【问题讨论】:

标签: java hadoop apache-spark cloud hadoop-yarn


【解决方案1】:

这是因为您的广播变量处于类级别。而且由于在工作节点中初始化类时,它不会看到您在 main 方法中分配的值。它只会看到一个空值,因为广播变量没有被初始化为任何东西。我找到的解决方案是在调用方法时将广播变量传递给方法。累加器也是如此

【讨论】:

  • 遇到了同样的问题,但是当我将累加器移到里面时,它会被 .forEach() 循环中的新值重写,而不是加法。我使用“avgTimeAccum.add(longValue);”但在我看来,累加器每次都降为零,因为我每个 rdd 只看到“longValue”本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多