SparkContext#runJob方法中func函数的作用



org.apache.spark.SparkContext#runJob方法:

 /**
    *
    * @param rdd  待计算的rdd
    * @param func 在rdd上运行的函数(不是我们Spark具体的计算逻辑),该函数一般是Driver用来收集结果的
    * @tparam T
    * @tparam U
    * @return 返回func在rdd运行的结果
    */
  def runJob[T, U: ClassTag](rdd: RDD[T], func: Iterator[T] => U): Array[U] = {

    runJob(rdd, func, 0 until rdd.partitions.length)
  }

该方法在如下处被调用,通过如下调用可知当Driver端发生类似collect操作(driver收集结果的操作)时候调用该函数。 注意:此func不是我们的RDD计算逻辑,RDD的计算逻辑在RDD的依赖关系中存储。

SparkContext#runJob方法中func函数的作用_第1张图片


 接下来以RDD.collect方法为例翻阅一下源码实现:

  /**
   * Return an array that contains all of the elements in this RDD.
   *
   * @note This method should only be used if the resulting array is expected to be small, as
   * all the data is loaded into the driver's memory.
   */
  def collect(): Array[T] = withScope {
    val results = sc.runJob(this, (iter: Iterator[T]) => iter.toArray)
    Array.concat(results: _*)//将所有数组拼接成一个数组
  }
此时runJob的func为:

iter: Iterator[T]) => iter.toArray
将结果以数组形式返回。








你可能感兴趣的:(SparkContext#runJob方法中func函数的作用)