복붙노트

[HADOOP] Apache SPARK : 브로드 캐스트 변수에 대한 -Nullpointer 예외 (YARN 클러스터 모드)

HADOOP

Apache SPARK : 브로드 캐스트 변수에 대한 -Nullpointer 예외 (YARN 클러스터 모드)

나는 YARN 클러스터에서 String 형 변수를 브로드 캐스팅하려고하는 간단한 스파크 애플리케이션을 가지고있다. 그러나 브로드 캐스트 된 변수 값에 액세스하려고 할 때마다 작업 내에서 null이 발생합니다. 너희들이 제안 할 수 있다면, 내가 여기서 잘못하고있는 일이 정말로 도움이 될 것이다. 내 코드는 다음과 같습니다 : -

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

해결법

  1. ==============================

    1.브로드 캐스트 변수가 클래스 수준에 있기 때문입니다. 그리고 클래스가 작업자 노드에서 초기화되면 main 메소드에서 할당 한 값을 볼 수 없게됩니다. 브로드 캐스트 변수가 초기화되지 않았기 때문에 null 만 표시됩니다. 내가 찾은 해법은 메서드를 호출 할 때 메서드에 브로드 캐스트 변수를 전달하는 것이 었습니다. 이것은 또한 Accumulators의 경우입니다.

    브로드 캐스트 변수가 클래스 수준에 있기 때문입니다. 그리고 클래스가 작업자 노드에서 초기화되면 main 메소드에서 할당 한 값을 볼 수 없게됩니다. 브로드 캐스트 변수가 초기화되지 않았기 때문에 null 만 표시됩니다. 내가 찾은 해법은 메서드를 호출 할 때 메서드에 브로드 캐스트 변수를 전달하는 것이 었습니다. 이것은 또한 Accumulators의 경우입니다.

  2. from https://stackoverflow.com/questions/28875921/apache-spark-nullpointer-exception-on-broadcast-variables-yarn-cluster-mode by cc-by-sa and MIT license