Spark和Spark JobServer最佳实践,以避免每次调用runJob时出现昂贵的重建对象(sc:SparkContext,config:Config)

时间:2017-04-19 20:51:14

标签: apache-spark spark-jobserver

下面每次都调用JobServer runJob API,我有一个时间成本逻辑来在runJob调用中重复构造一个对象

runJob(sc: SparkContext, config: Config)
  1. 将对象存储在内存中的最佳做法是什么,以避免每次调用runJob API时重复构造对象,以便每次调用runJob都可以在第一次调用时重用存储在内存中的对象?

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

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

  4. 除了常规对象之外,我还询问避免在每次调用中加载模型的最佳做法是什么,只需加载一次,然后所有后续调用都可以使用该模型。

  5. RDD和DataFrame具有类似的缓存和持久性功能,我正在寻找常规对象和模型。但是他们每次都需要调用readFile,只有操作才能从缓存中获益。还有一个问题是如何在每次调用RDD和DataFrame时避免读取文件?

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

  7. Spark JobServer的NamedRddSupport可以通过定义隐式持久存储来存储大型对象和模型吗?

1 个答案:

答案 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的分区。