Apache spark spark流媒体中的广播变量Null指针异常

Apache spark spark流媒体中的广播变量Null指针异常,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我有一个spark流应用程序,需要访问保存在HashMap中的模型。 在本地安装中使用广播变量运行相同的代码没有问题。然而,当我在spark测试集群上部署它时,我会得到一个空指针异常 我将一个模型存储在可序列化的HashMap中。我使用声明为全局静态变量的广播变量来广播此hashmap: public static Broadcast<HashMap<String,FieldModel>> br; HashMap<String,FieldModel> hm =

我有一个spark流应用程序,需要访问保存在HashMap中的模型。 在本地安装中使用广播变量运行相同的代码没有问题。然而,当我在spark测试集群上部署它时,我会得到一个空指针异常

我将一个模型存储在可序列化的HashMap中。我使用声明为全局静态变量的广播变量来广播此hashmap:

public static Broadcast<HashMap<String,FieldModel>> br;
HashMap<String,FieldModel> hm = checkerObj.getModel(esserver, type);
br = ssc.sparkContext().broadcast(hm);
公共静态广播br;
HashMap hm=checkerbj.getModel(esserver,type);
br=ssc.sparkContext().broadcast(hm);
我需要在映射器阶段访问此模型,并基于检查执行一些操作。下面是如何访问广播变量的一个片段

JavaDStream<Tuple3<Long,Double,String>> split = matched.map(new GenerateType2Scores());

class GenerateType2Scores implements Function<String, Tuple3<Long, Double, String>> {
    @Override
    public Tuple3<Long, Double, String> call(String s) throws Exception{

        Long time = Type2ViolationChecker.getMTS(s);
        HashMap<String,FieldModel> temphm= Type2ViolationChecker.br.value();

        Double score = Type2ViolationChecker.getAnomalyScore(temphm,s);
        return new Tuple3<Long, Double, String>(time,score, s);}
}
JavaDStream split=matched.map(new GenerateType2Scores());
类GenerateType2Scores实现函数{
@凌驾
公共Tuple3调用(字符串s)引发异常{
长时间=Type2ViolationChecker.getMTS;
HashMap temphm=Type2ViolationChecker.br.value();
双倍分数=Type2ViolationChecker.getAnomalyScore(temphm,s);
返回新的Tuple3(时间、分数、s);}
}
temphm应该引用存储在广播变量中的hashmap。 有人能帮助我理解在JAVA中访问广播变量的正确方法是什么吗


我已经创建了一个参考代码的要点:

我找到答案要感谢@user52045


广播变量必须声明为最终变量,并且不能声明为全局引用的静态变量:p

广播变量不应该是静态的。我有类似的问题,如果广播变量必须声明为最终变量,这里会有什么问题?如果是,这在UDF中是否可以访问,而不作为参数传递?