关于设置 maxPartitionBytes
maxPartitionBytes是什么
Spark在读取文件时默认设置每个partition 最多存储128M的数据。所以当读取的文件,比如csv
文件小于128M,则这个文件的所有内容会放到一个partition里面。
为什么要设置 maxPartitionBytes
当你想提高一下处理效率的时候,你就会用到maxPartitionBytes
举例:你现在电脑有2个处理器,要处理一个60M的csv文件,这时你用spark.read.csv()
把数据读进来了,在设置Spark Session时,setMaster("local[*]")
。Spark会把这60M的数据都放到2个partition里。
因为
the number of partition = max(the number of blocks of the file, sc.defaultMinPartitions)
partition 的数量 = 取最大(这个文件被分成几块,默认的最小分区数)
60M的文件没超过128M,所以不会被分割,所以是“1”;默认使用所有的处理器,处理器数是“2”,所以60M的数据会分到两个partition里。
你为了提高平行处理的效率,可以把默认的128M改成,比如说10M,这样,在读取文件时,Spark就会把这60M的文件分别存储在6个partition里,这样之后的运算效率就会高很多。
PS:为啥是6个partition?60M的文件会被分成6个block,然后6>2(默认使用全部处理器,2个)
怎么设置,以Python为例
maxPartitionBytes的设置需要在你开始创建Spark Session时设置。
from pyspark.sql import SparkSession
spark = SparkSession\
.builder()\
.appName("Spark SQL basic example")\
.config("spark.sql.files.maxPartitionBytes", 10000000)\
.getOrCreate()
from pyspark.sql import SparkSession
spark = SparkSession\
.builder()\
.appName("Spark SQL basic example")\
.config("spark.sql.files.maxPartitionBytes", 10000000)\
.getOrCreate()
References:
[1] https://spark.apache.org/docs/2.4.0/sql-performance-tuning.html#other-configuration-options
[2] https://stackoverflow.com/questions/52043874/limiting-maximum-size-of-dataframe-partition