Spark基础【RDD分区和并行度】

本文介绍了Spark中RDD的分区原理,说明了分区不存储数据但指示数据流向的作用。详细讨论了分区数量的设定,包括默认值和自定义设置。通过实例展示了集合数据在不同分区情况下的分布策略,并探讨了磁盘文件的分区设定,强调了Spark读取文件时,分区数量受Hadoop文件切片规则影响。此外,还分析了Hadoop的读取规则,如按行和偏移量读取数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 RDD分区和并行度

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合

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

注意这里的并行执行的任务数量,并不是指的切分任务的数量。

1 分区原理

可分区:让数据能够并行计算,采用分区的概念,与kafka中的分区略有不同,kafka的分区可以保存数据,而RDD的分区不保存数据

既然RDD中的分区不存储数据,那么分区有什么用呢?

答:当有多个Executor多个Task时,为防止热点,过载问题,通过分区指示数据走哪个分区,可以将分区理解为管道,数据理解为水,水在管道中流,流过之后水并不会留在管道中

2 分区数量

saveAsTextFile方法可以生成分区文件,将数据按照分区的形式保存为文件,有几个分区就会保存几份文件

文件的保存过程由Executor完成,目前分区数量为系统默认(local[*])

def main(args: Array[String]): Unit = {
   
  val conf = new SparkConf().setMaster("local[*]").setAppName("RDD")
  val sc = new SparkContext(conf)

  val rdd1 = sc.makeRDD(
    List(1,2,3,4)
  )
  rdd1.saveAsTextFile("output")
  sc.stop()
}

如果构建RDD时,没有指定数据处理分区的数量,就会使用默认分区的数量

mkRDD方法存在第二个参数,代表分区的数量numSlices(存在默认值)

默认值为:scheduler.conf.getInt("spark.default.parallelism", totalCores)
	
	其中conf指向的是以下代码中的conf
	
	取到值使用spark.default.parallelism,取不到使用totalCores
    	如:conf.set("spark.default.parallelism","4")
    	
	totalCores : 当前Master环境的总(虚拟)核数,非系统的总核数,不是固定值
		local:1个
		local[2]:2个
		local[*]:机器的总核数

分区设置的优先级 : 方法参数 > 配置参数 > 环境配置,只会使用一个

方法参数:
val rdd1 = sc.makeRDD(
  List(1,2,3,4),1
)

配置参数:
conf.set("spark.default.parallelism","2")

环境配置:
val conf 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneTenTwo76

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值