Spark分区数计算

分区数在Spark性能调优中至关重要。分区过少可能导致并行度不足和数据倾斜,过多则增加调度开销。对于Hadoop数据源,Spark默认按HDFS块创建分区;非Hadoop数据源,分区数依赖于源类型和转换操作。设置100-10K partitions通常是合适的,以确保不超过集群核心数的2-3倍,并避免调度延迟超过执行时间。

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

分区数决定并行度,所以其重要性在性能调优方面不言而喻。
1、如果分区数过少,一方面会造成并行度不够,可能造成集群资源闲置,不能充分发挥整个集群的能力。另一方面会造成分区过大,发生数据倾斜的可能性就更高。
2、如果分区数过多,那么花在任务调度上的时间可能要比实际执行任务的时间长。

--------------------------------------------------分区数的确定--------------------------------------------------

在没有指定分区数的情况下,分区数默认被设置为defaultMinPartitions
def defaultMinPartitions: Int = math.min(defaultParallelism, 2) 也就是说,分区数不超过2个,
官方给的解释是为了保证在处理小文件时的性能。
这种情况更多地适用于从一个Scala集合来创建一个RDD,例如sc.parallelize(List(1,2,3,6))。

一、对于Hadoop数据源

一般情况下,分区数可通过如下公式表示
分区数=max(sc.defaultParallelism, total_data_size / data_block_size)

Spark支持所有hadoop I/O格式,因为它使用相同的Hadoop InputFoarmat API以及Spark自有的其它格式化程序。因此,在默认情况下,Spark的输入分区和Hadoop/MapReduce的输入分片方式一致。

通常情况下,Spark为每一个hdfs块创建一个分区(注:如果行特别长,大于一个块大小,那么最终分区数会少于块数)。但是,若你要进一步的分割,Spark便会进行按行分割操作。

需要注意的是,当输入文件是压缩文件,分区数量还要视压缩格式是否支持分割而定。

以下代码是Hadoop MapReduce获取分片的操作:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值