火花流中的广播变量空指针异常

Posted

技术标签:

【中文标题】火花流中的广播变量空指针异常【英文标题】:Broadcast variable Null pointer exception in spark streaming 【发布时间】:2015-06-23 15:04:18 【问题描述】:

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

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

public static Broadcast<HashMap<String,FieldModel>> br;
HashMap<String,FieldModel> hm = checkerObj.getModel(esserver, type);
br = ssc.sparkContext().broadcast(hm);

我需要在我的映射器阶段访问这个模型,并根据检查进行一些操作。以下是我如何访问广播变量的 sn-p。

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

temphm 应该引用存储在广播变量中的 hashmap。 谁能帮我理解在 JAVA 中访问广播变量的正确方法是什么?

我创建了一个要点来引用代码:https://gist.github.com/nipunarora/ed987e45028250248edc

【问题讨论】:

广播变量不应该是静态的。 【参考方案1】:

感谢@user52045,我找到了答案。

广播变量必须声明为 final,并且不能声明为 static 用于全局引用:P

【讨论】:

我有类似的问题,这里有什么问题***.com/questions/64003697/… ***.com/questions/63935600/… 如果广播变量必须声明为 final ,如果是这样,这是否可以在 UDF 内部访问而不作为参数传递?

以上是关于火花流中的广播变量空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

Java中的空指针问题。

如何解决空指针异常和 ThreadException 中的错误android

Spark 2.2 空安全左外连接空指针异常

java中的空指针异常怎么解决

java hashmap空指针异常

java空指针异常:java.lang.NullPointException