У меня есть около 30000 очень маленьких JSON-файлов, которые я пытаюсь загрузить в информационный фрейм Spark (из смонтированной корзины S3). Сообщается здесь и здесь , что могут быть проблемы с производительностью, и описывается как Hadoop Small Files Problem
. В отличие от того, о чем ранее сообщалось, я не возвращаюсь в каталоги (так как все мои файлы JSON находятся в одной подпапке). Мой код для загрузки файлов JSON выглядит следующим образом.
val df = spark
.read
.option("multiline", "true")
.json("/mnt/mybucket/myfolder/*.json")
.cache
Пока моя работа "застряла". Я вижу 2 этапа.
- Задание 0, Этап 0: список конечных файлов и каталогов
- Задание 1, этап 1: val df = spark .read .option ("multiline", "...
Job 0, Stage 0
довольно быстро, менее 1 минуты. Job 1, Stage 1
, однако, требуется вечность, чтобы даже появиться (потерянный счет времени, но между двумя мы говорим более 20 минут), и когда он появляется в пользовательском интерфейсе заданий, он, кажется, "застрял" ( Я все еще жду о любом прогрессе, о котором сообщат через 15 + минут). Интересно, что Job 0, Stage 0
имеет 200 задач (я вижу, что используются 7 исполнителей), а Job 1, Stage 1
имеет только 1 задачу (кажется, что используется только 1 узел / исполнитель! Что за пустая трата!).
Есть ли способ сделать этот, казалось бы, простой шаг загрузки 30 000 файлов быстрее или более быстрым?
Я подумал о том, чтобы просто «объединить» эти файлы в большие; Например, объедините 1000 файлов JSON в 30 больших (используя NDJSON ). Однако я скептически отношусь к этому подходу, поскольку объединение файлов (скажем, с использованием Python) само по себе может занять много времени (что-то вроде собственной команды linux ls
в этом каталоге занимает очень много времени для возврата); Кроме того, этот подход может нанести ущерб цели сквозных кластерных вычислений (не очень элегантно).