Spark和Spark Sopserver的最佳实践,以避免在Runjob的每个调用中昂贵的重建对象(SC:SparkC



下面的每一次dime Invoke soperver runjob api,我都有一个时间成本逻辑,可以在runjob call

中反复构造对象
runJob(sc: SparkContext, config: Config)
  1. 将对象存储在内存中以避免在runjob api的每个呼叫中重复对象构造对象的最佳实践是什么,以便每个调用runjob可以在第一个调用期间重复存储在内存中的对象?

  2. 如果我可以做1,那么当我需要更新对象时,我还可以在内存中删除对象吗?

  3. 如果我可以做1,我可以共享对象交叉集群吗?

  4. 除了常规对象外,我还问避免在每个呼叫中加载模型的最佳做法,但只需加载一次,然后所有以下呼叫都可以使用模型。

  5. RDD和DataFrame具有相似的缓存和持久功能,我正在寻找常规对象和模型。但是它们要求每次都调用ReadFile,并且只有从缓存中造成的操作。另一个问题是如何避免在RDD和DataFrame的每个呼叫中读取文件?

  6. 可以将广播变量和累加器用于常规对象和模型吗?

  7. 可以通过定义隐式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的分区上。

最新更新