Spark---并行度和分区

Spark之并行度和分区



并行度和分区

默认情况下,Spark 可以将一个作业切分多个任务后,发送给 Executor 节点并行计算,而能
够并行计算的任务数量我们称之为并行度。这个数量可以在构建 RDD 时指定。记住,这里
的并行执行的任务数量(Task),并不是指的切分任务的数量。

集合数据源分区

def main(args: Array[String]): Unit = {
    //准备环境
    //[*]----当前系统的核数
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val sc = new SparkContext(sparkConf)
    //创建RDD
    /**
     * RDD的并行度&分区
     * makeRDD方法可以传递第二个参数,这个参数表示分区的数量
     * 第二个参数可以不传递,makeRDD会使用默认值:defaultParallelism(默认并行度)
     * spark在默认情况下,从配置对象中获取配置参数 spark.default.Parallelism
     * 如果获取不到,那么使用totalCores属性,这个取值为当前环境最大核数
     */
    val rdd: RDD[Int] = sc.makeRDD( List(1, 2, 3, 4, 5), 2)
    //将处理的数据保存成分区文件
    rdd.saveAsTextFile("output")
    //关闭环境
    sc.stop()
  }

在这里插入图片描述
在这里插入图片描述
第二个参数可以不传递,makeRDD会使用默认值:defaultParallelism(默认并行度)
在不传参数的情况下
spark在默认情况下,从配置对象中获取配置参数 spark.default.Parallelism
如果获取不到,那么使用totalCores属性,这个取值为当前环境最大核数
就是开头配置的环境

val sparkConf: SparkConf = new SparkConf().setMaster(“local[*]”).setAppName(“RDD”)

先获取sparkConf.set(“spark.default.parallelism”,“5”)

  //[*]----当前系统的核数
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    //可配置默认并行度----核心数
    sparkConf.set("spark.default.parallelism","5")
    val sc = new SparkContext(sparkConf)
    //创建RDD
    val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
    val partitions: Int = rdd.getNumPartitions
    println(s"分区数量为:$partitions ")
    //关闭环境
    sc.stop()

在这里插入图片描述

没有设置时,取值为当前环境最大核数

    val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
    val partitions: Int = rdd.getNumPartitions
    println(s"分区数量为:$partitions ")
    //将处理的数据保存成分区文件
    //rdd.saveAsTextFile("output")

在这里插入图片描述
在这里插入图片描述

文件数据源分区

读取文件数据时,数据是按照 Hadoop 文件读取的规则进行切片分区,而切片规则和数据读取的规则有些差异。

默认分区数

  def main(args: Array[String]): Unit = {
    //准备环境
    //[*]----当前系统的核数
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val sc = new SparkContext(sparkConf)
    //创建RDD
    //textFile可以将文件作为数据处理的数据源,默认也可以设定分区
    /**
     * minPartitions最小分区数量
     * math.min(defaultParallelism,2)
     * 如果不想使用默认分区数量,可以通过第二个参数修改
     * 真正的分区数会比这个参数大
     * spark读取文件底层使用的是Hadoop读取文件的方式
     * 分区数量的计算方式
     * totalSize=7
     * goalSize=7/2=3(byte)
     *
     * 7/3=2...1(1.1倍)+1=3个分区
     */
    val rdd = sc.textFile("datas/1.txt")
    rdd.saveAsTextFile("output")
    //关闭环境
    sc.stop()
  }

在这里插入图片描述
在这里插入图片描述

指定分区数

在这里插入图片描述

文件分区数量的计算方式

文件为
在这里插入图片描述

如果指定分区数量设置为2,但实际分区数量为3

在这里插入图片描述
文件大小有7个字节,但文件内只有1 2 3
在这里插入图片描述
其实是包含了回车换行,也就是7个字节
在这里插入图片描述
计算公式

  • totalSize=7
  • goalSize=7/2=3(byte)—表示每个分区有3个字节
  • 7/3=2…1(1.1倍)+1=3个分区----两个分区不够,剩余的数占每个分区的字节数大于10%等同于产生新的分区,如果小于10%不会产生新的分区

所以就会产生三个分区。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spark并行度和shuffle并行度Spark中两个重要的概念。 spark并行度是指在Spark作业中同时执行的任务数量。它由spark.default.parallelism参数控制,默认值为CPU核心数。可以通过设置该参数来调整并行度,以便更好地利用集群资源。 shuffle并行度是指在进行shuffle操作时,数据被划分为多个分区并在不同的节点上进行处理的能力。它由spark.sql.shuffle.partitions参数控制,默认值为200。可以通过设置该参数来调整shuffle操作的并行度,以便更好地平衡负载和提高性能。 spark.sql.shuffle.partitions和spark.default.parallelism的区别在于它们的作用范围和影响对象。spark.default.parallelism是全局参数,影响整个Spark应用程序的并行度。而spark.sql.shuffle.partitions是针对Spark SQL中的shuffle操作的参数,只影响与shuffle相关的操作的并行度。 设置spark.sql.shuffle.partitions和spark.default.parallelism的值可以根据具体的需求进行调整。一般来说,可以根据数据量、集群规模和任务复杂度等因素来决定并行度的设置。较大的并行度可以提高作业的执行速度,但也会增加资源消耗。较小的并行度可以减少资源消耗,但可能导致作业执行时间较长。 总结起来,spark并行度是指整个Spark应用程序的任务并行度,而shuffle并行度是指shuffle操作的并行度。可以通过调整spark.default.parallelism和spark.sql.shuffle.partitions的值来优化Spark作业的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值