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



