下面的每一次dime Invoke soperver runjob api,我都有一个时间成本逻辑,可以在runjob call
中反复构造对象runJob(sc: SparkContext, config: Config)
将对象存储在内存中以避免在runjob api的每个呼叫中重复对象构造对象的最佳实践是什么,以便每个调用runjob可以在第一个调用期间重复存储在内存中的对象?
如果我可以做1,那么当我需要更新对象时,我还可以在内存中删除对象吗?
如果我可以做1,我可以共享对象交叉集群吗?
除了常规对象外,我还问避免在每个呼叫中加载模型的最佳做法,但只需加载一次,然后所有以下呼叫都可以使用模型。
RDD和DataFrame具有相似的缓存和持久功能,我正在寻找常规对象和模型。但是它们要求每次都调用ReadFile,并且只有从缓存中造成的操作。另一个问题是如何避免在RDD和DataFrame的每个呼叫中读取文件?
可以将广播变量和累加器用于常规对象和模型吗?
可以通过定义隐式persisters sparkerver的名字命名为rddSupport存储大型对象和模型吗?
我相信广播非常适合您的数据和累加器,分别适合您的模型。我只想补充说,您可能需要研究mapPartitions
提供的功能,该功能使您只能执行每个分区一次昂贵的初始化。
这是学习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
的分区上。