我在Spark驱动程序中有一个模块,用于监听Kafka队列,并根据队列的内容,我需要修改Broadcast变量(或闭包)的内容。在这个例子中,这可能是一个字符串。
例如,如果字符串“change”到达队列,我需要更新每个节点中的Broadcast变量。
我希望看到一个执行此操作的模式,该模式是干净且高效的,或至少接收一个输入,我可以在其中找到一些材料以更好地了解如何在Spark群集中传播修改。
答案 0 :(得分:0)
广播变量确实是使用对等协议将变量或整个闭包传播到spark集群。
广播变量是 只是一个类型为spark.broadcast.Broadcast [T]的对象,它包含了一个值 键入T.我们可以通过调用我们的Broadcast对象中的值来访问此值 任务。该值仅使用高效的BitTorrent类型发送到每个节点一次 沟通机制。
对性能的影响是您使用的序列化方法(例如:Kryo,自定义方法,......):
书中有一个例子:
例6-8。使用Scala中的广播值进行国家/地区查找
// Look up the countries for each call sign for the
// contactCounts RDD. We load an array of call sign
// prefixes to country code to support this lookup.
val signPrefixes = sc.broadcast(loadCallSignTable())
val countryContactCounts = contactCounts.map {
case (sign, count) =>
val country = lookupInArray(sign, signPrefixes.value) (country, count)
}.reduceByKey((x, y) => x + y)
countryContactCounts.saveAsTextFile(outputDir + "/countries.txt")
如这些示例所示,使用广播变量的过程很简单: 1.通过在类型对象上调用SparkContext.broadcast来创建Broadcast [T] T.任何类型都可以工作,只要它也是Serializable。 2.使用Java中的value属性(或value()方法)访问其值。 3.变量将仅发送到每个节点一次,并应视为读取 only(更新不会传播到其他节点)。