Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap作为Spark流媒体中的广播变量?_Java_Apache Spark_Spark Streaming - Fatal编程技术网

Java HashMap作为Spark流媒体中的广播变量?

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中,您可以以相同的方式广播任何可序列化对象。这是最好的方法,因为您只向工

我有一些数据需要在spark streaming中进行分类。分类键值在HashMap中的程序开始时加载。因此,需要将每个传入数据包与这些密钥进行比较,并相应地进行标记

我意识到spark有称为广播变量和累加器的变量来分配对象。教程中的示例使用了简单的变量,如etc

如何使用HashMap在所有spark workers上共享我的HashMap。或者,有没有更好的方法


我正在用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问题是广播变量不能是静态的。它必须是一个成员变量。你的职位是我的救星。这些肮脏的证据让我很难受。很高兴我能帮上忙!