zoukankan      html  css  js  c++  java
  • 【knowledgebase】不要在一个很大的RDD上调用collect

    如果一个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()
    }
  • 相关阅读:
    软件工程
    ROR
    全息技术(Holographic technique)
    VR技术、AR技术、MR技术
    人工智能(AI)
    机器学习(Machine Learning)
    hdoj Scaena Felix
    周赛题解
    Good Luck in CET-4 Everybody!(博弈)
    Paths on a Grid(规律)
  • 原文地址:https://www.cnblogs.com/luogankun/p/4277958.html
Copyright © 2011-2022 走看看