RDD并行度和分区
- 能够并行计算的任务数量,我们称之为并行度。例如只有一个executor-cores,那并行计算的任务就只有一个
- 分区是能够并行计算的最大的并行度
1.分区个数生成规则
1.textFile 文件数据源
1.分区相关参数定义
val rdd=sc.textFile(path="xxxx",用户指定的分区)<br>
如果没有用户指定的分区,则用defaultMinPartitions<br>
defaultMinPartitions: Int = math.min(defaultParallelism, 2)<br>
defaultParallelism= scheduler.conf.getInt("spark.default.parallelism", totalCores)<br>
- 分区数据计算方式
使用了HadoopFile.spark读取文件底层是hadoop的方式
totalSize 代表该文件的大小
gogalSize= totalSize/并行度=M(byte)
M代表每个分区的字节。 - 1.1概念
在hadoop划分分区时,如果余下的分区长度大于M数量的10%就放在新分区,如果小于10%就放在老的分区
2.makeRDD 并行度
1. spark.makrRDD在没有设置分区的时候下,在默认情况下,会从spark.default.parallelism中获取分区
2. 如果没有spark.default.parallelism,则使用totalCores属性,这个属性是当前环境的最大可用核数
3.以分区形式保存
rdd.saveAsTextFile("output")
2. spark读取TextFile数据分区的分配方式
-
数据以行为单位进行读取
- spark读取文件,采用的是hadoop的方式读取,
一行一行
的读取,和字节数没有关系 - 数据读取时以偏移量为单位。偏移量不会被重新读取
- 分区设定值大于需要处理的数据长度(byte),则以最小单位1Byte来进行区分。如输入为15byte,但是 有80个分区。15/80=0,则最后只有15/1=15个分区
- 如果数据源为
多个文件
,计算分区时以文件
为单位
分区读取实例:输入为1##2##3 ,默认分区为2。
下面是相关内容1## =>012 2## =>345 3 =>6
数据分区的偏移量范围的计算,由于3在第一行被读了,记录了偏移量。因此在第二行的时候就不会继续读3
// 0=> [0,3] =>12 // 1=> [3,6] // 2=> [6,7]
- spark读取文件,采用的是hadoop的方式读取,
3. 并行度和分区
多少个分区可以表示多少个任务同时运行
如下图所示176个分区,textFile输入有两个文件,内容一样,文件的length是88Byte,手动设置的分区是1000。因为88/1000<1,则默认为1Byte为1个分区。又由于计算分区是以文件为单位。因此拥有88*2=176个Task