【Spark源码】RDD分区&RDD分区数据分配

RDD分区

  • 创建RDD时自定义分区数量
  • 根据计算机Core个数确定默认分区数量

核心代码

override def defaultParallelism(): Int =
    scheduler.conf.getInt("spark.default.parallelism", totalCores)
  • 首选SparkConf配置的spark.default.parallelism分区数量
  • 如果没有配置,则采用计算机的核心数量totalCores作为分区数量

分析源码步骤

  1. 程序- -分区源码入口- -.makeRDD()
    在这里插入图片描述
  2. 默认并行度defaultParallelism
    在这里插入图片描述
  3. 默认并行度defaultParallelism
    在这里插入图片描述
  4. 默认并行度defaultParallelism
    在这里插入图片描述
  5. 此时defaultParallelism位于TaskScheduler.scala中,次未见类型为Trait类型,没有函数体,在Intellij IDEA中,按快捷键ctrl+H查看文件继承层级关系,查看TaskSchedulerImpl.scala文件
    在这里插入图片描述
  6. 默认并行度defaultParallelism
    在这里插入图片描述
  7. 同上,ctrl+H查看层级关系,查看LocalSchedulerBackend.scala文件
    在这里插入图片描述
  8. 默认并行度defaultParallelism,核心代码
    在这里插入图片描述
  9. conf为SparkConf环境配置变量
    在这里插入图片描述

RDD分区数据分配

  • 根据数据类型(Range or 其他)采用不同的数据划分策略,本文以List类型数据为例
  • 数据分配方式计算,与切片数量,数据长度有关

核心代码

def positions(length:Long,numSlices:Int):Iterator[(Int,Int)]={
		//0~切片个数,进行遍历
		(0 until numSlices).iterator.map{i=>
		val start=((i*length)/numSlices).toInt
		val end=(((i+1)*length)/numSlices).toInt
		(start,end)
	}
}

例:
数据:4, 3, 2,1, 0
切片数量:3
调用position方法


length = 5 //数据长度
numSlice = 3 //分区数量
0 until numSlices => 0, 1, 2 //分区索引


if i=0
start = 0
end = 1
=> 切片1的数据(4)


if i=1
start = 1 * 5 / 3 = 1
end = 2 * 5 / 3 = 3
=>切片2的数据(3, 2)


if i=2
start = 2 * 5 / 3 = 3
end = 3 * 5 / 3 = 5
=>切片3的数据(1,0)

分析源码步骤

  1. 程序入口- - 数据分配源码 - - makeRDD()
    在这里插入图片描述
  2. 调用parallelize函数
    在这里插入图片描述
  3. 声明ParallelCollectionRDD类对象
    在这里插入图片描述
  4. ParallelCollectionRDD类中重写getPartitions方法,调用slice方法
    在这里插入图片描述
  5. 划分数据的核心方法ParallelCollectionRDD(函数分成了两张图片)
    • 传入参数:序列seq,切片个数numSlices
    • 先判断numSlices >= 1
    • 定义划分position方法,划分出起始位置和结束位置start和end
    • seq进行模式匹配
    • case r 和 nr均为匹配Range(范围)类型的数据
    • 其他数据类型转换为数组进行范围划分
      在这里插入图片描述
      在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值