我想要做的是在每个Spark工作者中生成一个上下文,我可以将其用于本地查找。 查找数据位于数据库中,我想将其缓存在每个工作者上。有一种简单的方法可以做到这一点吗?
使用的变通办法:
Broadcast
变量并将其与我的函数一起使用。函数第一次尝试访问它时,我调用我的SQL代码来初始化它。 Broadcast
并使用种子广播将其提供给工作人员 PS。我没有使用JdbcRDD
因为我希望复制数据而不是分区。有谁知道如果我不使用JdbcRDD
的分区属性会发生什么?这会让它发挥作用还是会产生非确定性行为?
答案 0 :(得分:4)
您可以创建一个包含对要使用的分辨率缓存的引用的单例对象:
object ResolutionCache {
var connection = _
var cache: Map[Key,Value] = Map()
def resolve(key:Key):Value = ???
}
然后,此对象可用于解析RDD操作中的值:
val resolved = keysRDD.map(key => (key -> ResolutionCache.resolve(key)))
此对象保存的连接和值将按工作者JVM独立维护。
我们必须特别注意连接管理和并发行为。特别是,resolve
必须是线程安全的。