是否可以直接在Spark工作者中创建变量?

时间:2015-01-13 13:54:08

标签: java apache-spark

我想要做的是在每个Spark工作者中生成一个上下文,我可以将其用于本地查找。 查找数据位于数据库中,我想将其缓存在每个工作者上。有一种简单的方法可以做到这一点吗?

使用的变通办法:

  1. 创建一个延迟初始化的Broadcast变量并将其与我的函数一起使用。函数第一次尝试访问它时,我调用我的SQL代码来初始化它。
  2. 创建一个急切初始化的Broadcast并使用种子广播将其提供给工作人员
  3. PS。我没有使用JdbcRDD因为我希望复制数据而不是分区。有谁知道如果我不使用JdbcRDD的分区属性会发生什么?这会让它发挥作用还是会产生非确定性行为?

1 个答案:

答案 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必须是线程安全的。