spark数据分区划分和任务执行相关内容

## 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
    spark数据分区划分和任务执行相关内容_第1张图片

 

你可能感兴趣的:(spark相关,spark)