HashMap作为Spark Streaming中的广播变量?

时间:2015-06-10 16:34:50

标签: java apache-spark spark-streaming

我有一些数据需要归类为火花流。分类键值在HashMap中的程序开头加载。因此,需要将每个输入数据包与这些密钥进行比较并相应地进行标记。

我意识到spark有一些变量叫做广播变量和控制器来分配对象。教程中的示例使用简单的变量等。

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

我正在用Java编写我的spark流应用程序。

2 个答案:

答案 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();