定时更新广播变量
背景
spark streaming在处理数据的时候,需要和一些小表做join,或者从小表中获取数据,通常我们会采用广播变量的方式将数据缓存到每个worker节点上,由此,数据在exec端被计算的时候,就不需要从driver端获取小表的数据,能有效减小网络通讯开销。提高执行效率。 但是,广播变量是read-only的。 生产上,我们的这些小表是要被定时更新的。那就意味着,如果更新一次小表,就要重启一次job,重新将更新好的数据加载到内存中。显然这样是不合理的。
实现思路
1:用unpersist()方法清除缓存的数据 2:重新广播数据 3:使用计数器实现定时执行广播数据操作
代码逻辑
/** * Use this singleton to get or register a Broadcast variable. */ object DimTable { @volatile private var instance: Broadcast[Array[String]] = null def getInstance(sc: SparkContext): Broadcast[Array[String]] = { if (instance == null) { synchronized { if (instance == null) { val dimMapTmp = sc.parallelize(Array("1", "2", "3")).cache().collect() instance = sc.broadcast(dimMapTmp) } } } in