Java HashMap作为Spark流媒体中的广播变量?
我有一些数据需要在spark streaming中进行分类。分类键值在HashMap中的程序开始时加载。因此,需要将每个传入数据包与这些密钥进行比较,并相应地进行标记 我意识到spark有称为广播变量和累加器的变量来分配对象。教程中的示例使用了简单的变量,如etc 如何使用HashMap在所有spark workers上共享我的HashMap。或者,有没有更好的方法Java HashMap作为Spark流媒体中的广播变量?,java,apache-spark,spark-streaming,Java,Apache Spark,Spark Streaming,我有一些数据需要在spark streaming中进行分类。分类键值在HashMap中的程序开始时加载。因此,需要将每个传入数据包与这些密钥进行比较,并相应地进行标记 我意识到spark有称为广播变量和累加器的变量来分配对象。教程中的示例使用了简单的变量,如etc 如何使用HashMap在所有spark workers上共享我的HashMap。或者,有没有更好的方法 我正在用Java编写spark流媒体应用程序。在spark中,您可以以相同的方式广播任何可序列化对象。这是最好的方法,因为您只向工
我正在用Java编写spark流媒体应用程序。在spark中,您可以以相同的方式广播任何可序列化对象。这是最好的方法,因为您只向工作人员发送一次数据,然后您就可以在任何任务中使用它 斯卡拉:
val br=ssc.sparkContext.broadcast(地图(1->2))
爪哇:
Broadcast br=ssc.sparkContext().Broadcast(新HashMap());
下面是一个更好的示例,说明如何使用Java广播HashMap:
在Spark应用程序中,您将创建或加载HashMap。
然后使用Sparksession广播该HashMap
HashMap<String,String> bcMap = new HashMap();
bcMap.put("key1","val1");
bcMap.put("key2","val2");
Broadcast<HashMap> bcVar = this.sparkSession.sparkContext().broadcast(bncFlowConflg, classTag(HashMap.class));
HashMap bcMap=newhashmap();
bcMap.put(“键1”、“值1”);
bcMap.put(“键2”、“值2”);
Broadcast bcVar=this.sparkSession.sparkContext().Broadcast(bncFlowConflg,classTag(HashMap.class));
您需要下面的类来创建classTag:
private static <T> ClassTag<T> classTag(Class<T> clazz) {
return scala.reflect.ClassManifestFactory.fromClass(clazz);
}
私有静态类标签类标签(类标签){
返回scala.reflect.ClassManifestFactory.fromClass(clazz);
}
您可以参考Spark功能中的广播,如地图,如下所示:
HashMap<String,String> bcVal = bcVar .getValue();
HashMap bcVal=bcVar.getValue();
您可以以相同的方式广播任何可序列化对象。其内部成员中的键n值应可序列化,或者根据映射器符号不具有setter/标记transient。这将是一个更好的答案,后面有一些解释,而不仅仅是代码。还有更多吗?我使用了一个广播变量,它工作过一次,但在随后的调用中,该变量返回null。经过一点研究,我在cloudera的论坛()上发现了这篇文章,其中提到没有广播变量作为类成员。@dmux问题是广播变量不能是静态的。它必须是一个成员变量。你的职位是我的救星。这些肮脏的证据让我很难受。很高兴我能帮上忙!