下面每次都调用JobServer runJob API,我有一个时间成本逻辑来在runJob调用中重复构造一个对象
runJob(sc: SparkContext, config: Config)
将对象存储在内存中的最佳做法是什么,以避免每次调用runJob API时重复构造对象,以便每次调用runJob都可以在第一次调用时重用存储在内存中的对象?
如果我能做1,那么当我需要更新对象时,我还可以删除内存中的对象吗?
如果我能做1,我可以共享对象跨群集吗?
除了常规对象之外,我还询问避免在每次调用中加载模型的最佳做法是什么,只需加载一次,然后所有后续调用都可以使用该模型。
RDD和DataFrame具有类似的缓存和持久性功能,我正在寻找常规对象和模型。但是他们每次都需要调用readFile,只有操作才能从缓存中获益。还有一个问题是如何在每次调用RDD和DataFrame时避免读取文件?
广播变量和累加器可用于常规对象和模型吗?
Spark JobServer的NamedRddSupport可以通过定义隐式持久存储来存储大型对象和模型吗?
答案 0 :(得分:0)
我相信广播分别非常适合您的数据和累积器。我想补充一点,您可能希望查看mapPartitions
提供的功能,它允许您每个分区执行一次昂贵的初始化。
这是来自 Learning Spark 的示例:
val contactsLists = validSigns.distinct().mapPartitions { signs = >
val mapper = createMapper()
val client = new HttpClient()
client.start() // create http request
signs.map { sign =>
createExchangeForSign(sign) // fetch responses
}.map {
case (sign, exchange) => (sign, readExchangeCallLog( mapper, exchange))
}.filter( x = > x._2 != null)
}
在这个例子中,昂贵的HttpClient
初始化只进行一次。然后使用结果迭代表示为Iterable
的分区。