【大数据面试知识点】分区器Partitioner:HashPartitioner、RangePartitioner

Spark HashParitioner的弊端是什么?

HashPartitioner分区的原理很简单,对于给定的key,计算其hashCode,并除于分区的个数取余,如果余数小于0,则用余数+分区的个数,最后返回的值就是这个key所属的分区ID;弊端是数据不均匀,容易导致数据倾斜,极端情况下某几个分区会拥有rdd的所有数据。

RangePartitioner分区的原理及特点?

原理:

RangePartitioner分区则尽量保证每个分区中数据量的均匀,而且分区与分区之间是有序的,也就是说一个分区中的元素肯定都是比另一个分区内的元素小或者大;但是分区内的元素是不能保证顺序的。简单的说就是将一定范围内的数映射到某一个分区内。其原理是水塘抽样。

特点:

RangePartioner尽量保证每个分区中数据量的均匀,而且分区与分区之间是有序的,一个分区中的元素肯定都是比另一个分区内的元素小或者大;但是分区内的元素是不能保证顺序的。简单的说就是将一定范围内的数映射到某一个分区内。RangePartitioner作用:将一定范围内的数映射到某一个分区内,在实现中,分界的算法尤为重要。算法对应的函数是rangeBounds。

自定义分区器 

1、定义一个Partitioner保证某一范围内的所有数据都在同一个分区

该分区根据数据范围划分为num个子范围,然后将每个数字分配到对应的子范围中,这种情况下当数据在各个子范围分布均匀时候可以表现良好。但是当数据严重聚集时候,会发生数据倾斜。当存在数据倾斜时候可以使用Spark提供的 RangePartitioner分区器进行分区。

import org.apache.spark.Partitioner

class SortPartitoner(num: Int) extends Partitioner {
  override def numPartitions: Int = num
  val partitionerSize = Integer.MAX_VALUE / num + 1
  override def getPartition(key: Any): Int = {
    val intKey = key.asInstanceOf[Int]
    intKey / partitionerSize
  }
}

2、分区内部排序,保证分区内有序 

object Sort {
  def main(args: Array[String]) {
    val conf = new SparkConf()
    val sc = new SparkContext(conf)
    val numbers = sc.textFile("/random.txt").flatMap(_.split(" ")).map(x => (x.toInt, 1)).cache()
    val result = numbers.repartitionAndSortWithinPartitions(new SortPartitoner(numbers.partitions.length)).map(x=>x._1)
    result.saveAsTextFile("/bigdatasort")
    sc.stop()
  }
}

参考

Spark Partitioner 分区器适用场景示例源码分析HashPartitioner RangePartitioner - 知乎

Spark分区器HashPartitioner和RangePartitioner/全局排序_spark全局排序-CSDN博客

相关推荐

  1. 数据分析------知识(六)

    2024-01-03 17:32:06       30 阅读
  2. 数据分析业务知识:口径

    2024-01-03 17:32:06       33 阅读
  3. 数据分析------统计学知识(三)

    2024-01-03 17:32:06       33 阅读
  4. 数据分析------统计学知识(一)

    2024-01-03 17:32:06       34 阅读
  5. 数据分析------统计学知识(二)

    2024-01-03 17:32:06       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-03 17:32:06       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-03 17:32:06       97 阅读
  3. 在Django里面运行非项目文件

    2024-01-03 17:32:06       78 阅读
  4. Python语言-面向对象

    2024-01-03 17:32:06       88 阅读

热门阅读

  1. 前端面试

    2024-01-03 17:32:06       50 阅读
  2. Python日期和时间详解

    2024-01-03 17:32:06       59 阅读
  3. React Proxy跨域配置(纯代码-可直接拉取使用)

    2024-01-03 17:32:06       54 阅读
  4. FreeRTOS任务通知

    2024-01-03 17:32:06       61 阅读
  5. 有效的APP推广策略:引领用户走向成功

    2024-01-03 17:32:06       62 阅读
  6. Python中的数据分析和数据处理

    2024-01-03 17:32:06       61 阅读
  7. 15、异常处理

    2024-01-03 17:32:06       56 阅读
  8. C++系列十一:C++指针

    2024-01-03 17:32:06       57 阅读
  9. 后端开发——jdbc的学习(一)

    2024-01-03 17:32:06       58 阅读
  10. 今日学习的是mysql-事物

    2024-01-03 17:32:06       65 阅读
  11. 算法练习Day27 (Leetcode/Python-贪心算法)

    2024-01-03 17:32:06       52 阅读
  12. Linux内核--进程管理(十二)共享内存和信号量

    2024-01-03 17:32:06       47 阅读
  13. MongoDB CRUD 概述

    2024-01-03 17:32:06       56 阅读