我有一些数据需要归类为火花流。分类键值在HashMap中的程序开头加载。因此,需要将每个输入数据包与这些密钥进行比较并相应地进行标记。
我意识到spark有一些变量叫做广播变量和控制器来分配对象。教程中的示例使用简单的变量等。
如何使用HashMap在所有spark worker上共享我的HashMap。或者,有更好的方法吗?
我正在用Java编写我的spark流应用程序。
答案 0 :(得分:4)
在spark中,您可以以相同的方式广播任何可序列化的对象。这是最好的方法,因为您只向工作人员发送一次数据,然后您可以在任何任务中使用它。
Scala的:
val br = ssc.sparkContext.broadcast(Map(1 -> 2))
爪哇:
Broadcast<HashMap<String, String>> br = ssc.sparkContext().broadcast(new HashMap<>());
答案 1 :(得分:0)
这是一个更好的示例,说明如何使用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));
您将需要以下类来创建classTag:
private static <T> ClassTag<T> classTag(Class<T> clazz) {
return scala.reflect.ClassManifestFactory.fromClass(clazz);
}
并且您可以在Spark功能(例如地图)中引用广播,如下所示:
HashMap<String,String> bcVal = bcVar .getValue();