Spark 2.4 + , проблема должна быть решена, см. Комментарий @ Rahul ниже этого ответа.
Spark 2.1-2.3 , аргумент minPartitions
binaryFiles()
игнорируется.См. Spark-16575 и изменения фиксации для функции setMinPartitions () .Обратите внимание, что в коммите изменяется, как minPartitions
больше не используется в функции!
Если вы читаете несколько двоичных файлов с binaryFiles()
, входные файлы будут объединены в разделы на основе следующего:
spark.files.maxPartitionBytes
, по умолчанию 128 МБ spark.files.openCostInBytes
, по умолчанию 4 МБ spark.default.parallelism
- общий размер вашего ввода
Первые три элемента конфигурации описаны здесь .См. Изменение фиксации выше, чтобы увидеть фактические вычисления.
У меня был сценарий, в котором я хотел максимум 40 МБ на входной раздел, следовательно, 40 МБ на задачу ... чтобы увеличить параллелизм при разборе.(Spark помещал 128 МБ в каждый раздел, замедляя работу моего приложения.) Я установил spark.files.maxPartitionBytes
на 40 М перед вызовом binaryFiles()
:
spark = SparkSession \
.builder \
.config("spark.files.maxPartitionBytes", 40*1024*1024)
Только для одного входного файла ответ @ user9864979 правильный: один файл не может быть разбит на несколько разделов с помощью binaryFiles()
.
При чтении нескольких файлов с Spark 1.6 аргумент minPartitions
работает, и вы должны его использовать.В противном случае вы столкнетесь с проблемой Spark-16575 : все ваши входные файлы будут считаны только в два раздела!
Вы обнаружите, что Spark обычно дает вамменьше входных разделов, чем вы запрашиваете.У меня был сценарий, где я хотел один входной раздел для каждых двух входных двоичных файлов.Я обнаружил, что установка minPartitions
на «# входных файлов * 7/10» дала мне примерно то, что я хотел.
У меня был другой сценарий, где я хотел один входной раздел для каждого входного файла.Я обнаружил, что установка minPartitions
на «количество входных файлов * 2» дала мне то, что я хотел.
Spark 1.5 поведение binaryFiles()
: вы получаете один раздел для каждого вводафайл.