码迷,mamicode.com
首页 > 其他好文 > 详细

【knowledgebase】不要在一个很大的RDD上调用collect

时间:2015-02-09 15:34:34      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

如果一个RDD很大以至于它的所有元素并不能在driver端机器的内存中存放下,请不要进行如下调用:

val values = myVeryLargeRDD.collect()
 
collect将尝试拷贝RDD中的每个元素到Driver端,容易导致OOM或者crash;
 
相反,如果你能通过调用take、takeSample、filter、sample等操作对返回的元素个数上限进行限制,再使用collect还是可以的;
 
查看RDD的collect方法源码:
def collect(): Array[T] = {
    val results = sc.runJob(this, (iter: Iterator[T]) => iter.toArray)
    Array.concat(results: _*)
}

 

注意:

countByKey、countByValue、collectAsMap操作在使用的时候也要注意数据集的大小能存放到内存中;
如果你确实想要知道RDD(数据非常大)中的每个元素,建议将RDD导出到文件、数据库中再进行查看。
 
 
countByKey、countByValue、collectAsMap方法源码:
PairRDDFunctions.scala
def countByKey(): Map[K, Long] = self.mapValues(_ => 1L).reduceByKey(_ + _).collect().toMap

def collectAsMap(): Map[K, V] = {
    val data = self.collect()
    val map = new mutable.HashMap[K, V]
    map.sizeHint(data.length)
    data.foreach { pair => map.put(pair._1, pair._2) }
    map
}

RDD.scala
def countByValue()(implicit ord: Ordering[T] = null): Map[T, Long] = {
    map(value => (value, null)).countByKey()
}

 

【knowledgebase】不要在一个很大的RDD上调用collect

标签:

原文地址:http://www.cnblogs.com/luogankun/p/4277958.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!