简简单单
来源:互联网 发布:越光宝盒 知乎 编辑:程序博客网 时间: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
- 简简单单
- 简简单单
- 简简单单
- 简简单单
- 简简单单
- 简简单单
- 简简单单long
- 简简单单,从零开始!
- 简简单单,随遇而安
- 7.1 简简单单
- 简简单单谈乐理
- 简简单单的singleton
- 简简单单就是快乐
- 纯真——简简单单
- 简简单单说SSDT
- 简简单单实现Ajax
- 一段简简单单的javascript
- 简简单单的生活!
- 算法分析之O表示法的总结
- DataLoad命令
- OpenCV——旋转模糊
- 第11周项目6(4-4)-回文素数
- 二叉树遍历 (递归算法)
- 简简单单
- 悟透JavaScript - 奇妙的对象
- 数字电路设计之VGA显示条形图的verilog实现
- Struts1.x ActionForm
- ios之工程中混合使用 ARC 和非ARC 配置方法
- SQL Server 2012修改sa密码的方法
- eclipse myeclipse 中的server的配置
- 二叉搜索树的后序遍历
- Android与设计模式——观察者(Observer)模式