通过之前文章的介绍,大家都知道广播变量是只读的,那么在Spark流式处理中如何进行动态更新广播变量?
既然无法更新,那么只能动态生成,应用场景有实时风控中根据业务情况调整规则库、实时日志ETL服务中获取最新的日志格式以及字段变更等。
/** @author : 公众号:大数据学习与分享 */
@volatile private var instance: Broadcast[Array[Int]] = null
//获取广播变量单例对象
def getInstance(sc: SparkContext, ctime: Long): Broadcast[Array[Int]] = {
if (instance == null) {
synchronized {
if (instance == null) {
instance = sc.broadcast(fetchLastestData())
}
}
}
instance
}
//加载要广播的数据,并更新广播变量
def updateBroadCastVar(sc: SparkContext, blocking: Boolean = false): Unit = {
if (instance != null) {
//删除缓存在executors上的广播副本,并可选择是否在删除完成后进行block等待
//底层可选择是否将driver端的广播副本也删除
instance.unpersist(blocking)
instance = sc.broadcast(fetchLastestData())
}
}
def fetchLastestData() = {
//动态获取需要更新的数据
//这里是伪代码
Array(1, 2, 3)
}
val dataFormat = FastDateFormat.g