简简单单

来源:互联网 发布:越光宝盒 知乎 编辑:程序博客网 时间:2024/04/30 03:11
首先说明,我是初spark的菜鸟,就是想读一些源码,然后将自己一些想法记录下来。

要是错了,批评指教。


这两天为看懂spark源码,一直啃scala的书,好歹功夫不负有心人,看懂了一些。


今天大概了解了 spark 一部分Partition过程,所以赶紧记录下来,边看边记,防止忘了。


先上3段代码:

object Partitioner {   def defaultPartitioner(rdd: RDD[_], others: RDD[_]*): Partitioner = {    val bySize = (Seq(rdd) ++ others).sortBy(_.partitions.size).reverse  //按RDD们的partition数量降序排    for (r <- bySize if r.partitioner.isDefined) {     //从头至尾检查,是否已经有定义好的Partitioner      return r.partitioner.get    }    if (rdd.context.conf.contains("spark.default.parallelism")) {  //检查是否设置 字段的值      new HashPartitioner(rdd.context.defaultParallelism)    } else {      new HashPartitioner(bySize.head.partitions.size)  //如果啥都没 设置,那就返回 RDD中partition最大数量值为参数 HashPartitioner    }  }}

class HashPartitioner(partitions: Int) extends Partitioner {  略。。。  def getPartition(key: Any): Int = key match {    case null => 0    case _ => Utils.nonNegativeMod(key.hashCode, numPartitions) //这里调用Utils.nonNegativeMod 得到partition编号  }  略....  }

Utils中的相应方法:

def nonNegativeMod(x: Int, mod: Int): Int = {    val rawMod = x % mod    rawMod + (if (rawMod < 0) mod else 0)  //这里rawMode 可能是负值,但是partition编号 >=0,所以要处理一下  }def nonNegativeHash(obj: AnyRef): Int = {    if (obj eq null) return 0   //这里只要是空就被映射到0    val hash = obj.hashCode    val hashAbs = if (Int.MinValue != hash) math.abs(hash) else 0       hashAbs  }


HashPartitioner 就是将key的hashcode 处理成  >=0 的数,然后 对 partition数量取模,或者 前后顺序颠倒,取模,处理成正数。


其实我没想明白,spark这里是如何保证均匀的 partition,还有其他的partitioner要研究。。。,


0 0