Понимание количества разделов, созданных Spark

#apache-spark #pyspark #apache-spark-sql

Вопрос:

Сколько разделов pyspark-sql создаст при чтении файла .csv?

Я понимаю это так number of partitions = math.ceil(file_size/spark.conf.get('spark.sql.files.maxPartitionBytes'))

На моей машине:

 spark.conf.get('spark.sql.files.maxPartitionBytes')
output: 
'134217728b' #128MBs
 

Однако я не наблюдаю такого поведения. Я создаю файл, который занимает 96 МБ на диске. Я запускаю spark в локальном режиме. У меня 8-ядерный ноутбук. Я думаю, что он должен был быть прочитан в 1 разделе. Однако файл считывается в 8 разделах. Ниже приведена кодовая база, которую я использовал:

 import pandas as pd
import numpy as np
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
#creating a small DataFrame. This will occupy 96 MBs on disk
pd.DataFrame({'id':np.arange(10000000),'b':np.random.choice(['a','b','c','d'],size=(10000000,),p=[0.25,0.25,0.25,0.25])}).to_csv('df_s.csv',index=None)
sd=spark.read.csv('df_s.csv',schema="id int, b string")
sd.rdd.getNumPartitions()
output: 8
 

Не могли бы вы помочь мне понять, почему я вижу 8 разделов независимо от размера файла?

Ответ №1:

Фактическая формула на самом деле немного сложнее. Проверьте приведенный ниже расчет. Вы можете найти исходный код здесь.

Это ваша конфигурация и ваш файл

Конфигурация Spark Значение По умолчанию
spark.sql.files.maxPartitionBytes 128 МБ 128 МБ
spark.sql.files.openCostInBytes 4M 4M
spark.executor.instances 1 Местные новости
spark.executor.cores 8 ваши ядра
spark.default.parallelism 8 =spark.executor.instances * spark.executor.cores
размер файлов данных 64M
количество файлов данных 1

Это фактическая формула

Формула Байты
DefaultMaxSplitBytes = spark.sql.files.maxPartitionBytes 134,217,728
OpenCostInBytes = spark.sql.files.openCostInBytes 4,194,304
DefaultПараллелизм = spark.default.parallelism 8
Всего байтов = Байты данных (# files * OpenCostInBytes) 71,303,168
BytesPerCore = TotalBytes / DefaultПараллелизм 8,912,896
MaxSplitBytes = MIN(DefaultMaxSplitBytes, MAX(OpenCostInBytes, BytesPerCore)) 8,912,896
Предполагаемое количество разделов = TotalBytes / MaxSplitBytes 8