Как Apache Spark разделяет данные большого файла

Допустим, у меня есть кластер из 4 nodes, каждый из которых имеет 1 core. У меня есть большой файл размером 600 Petabytes, который я хочу обработать через Spark. Файл может быть сохранен в HDFS.

Я думаю, что так определить нет. разделов составляет размер файла / общее количество. ядер в кластере. Если это действительно так, у меня будет 4 partitions(600/4), поэтому размер каждого раздела будет 125 PB.

Но я думаю, что 125 PB слишком большой размер для раздела, поэтому правильно ли я думаю, что это не так. разделов.

PS: я только начал с Apache Spark. Так что извините, если это наивный вопрос.


person Anand    schedule 27.07.2018    source источник
comment
Меня интересует, где вы храните этот файл....   -  person Arj    schedule 27.07.2018
comment
@Arj - В HDFS, обновлено выше. Имеет ли значение, в HDFS или в локальной файловой системе?   -  person Anand    schedule 27.07.2018


Ответы (2)


Поскольку вы храните свои данные в HDFS, они уже будут разделены на блоки по 64 МБ или 128 МБ в соответствии с вашей конфигурацией HDFS. (Предположим, блоки размером 128 МБ.)

Таким образом, 600 петабайт дадут 4687500000 блоков по 128 МБ каждый. (600 петабайт/128 МБ)

Теперь, когда вы запускаете задание Spark, каждый исполнитель будет считывать несколько блоков данных (количество блоков будет равно количеству ядер в исполнителе) и обрабатывать их параллельно.

По сути, каждое ядро ​​будет обрабатывать 1 раздел. Таким образом, чем больше ядер вы даете исполнителю, тем больше данных он может обработать, но в то же время вам нужно будет выделить исполнителю больше памяти для обработки размера данных, загруженных в память.

Рекомендуется иметь исполнителей среднего размера. Наличие слишком большого количества мелких исполнителей приведет к большому перемешиванию данных.

Теперь перейдем к вашему сценарию, если у вас есть кластер из 4 узлов с 1 ядром в каждом. У вас будет 3 исполнителя, работающих на них максимум, так как 1 ядро ​​​​будет взято для драйвера искры. Таким образом, для обработки данных вы сможете обрабатывать 3 раздела параллельно. поэтому для обработки всех данных вашей работе потребуется 4687500000/3 = 1562500000 итераций.

Надеюсь, это поможет!

Ваше здоровье!

person Kaushal    schedule 27.07.2018

Чтобы ответить на ваш вопрос, если вы сохранили файл в HDFS, он уже разделен на основе вашей конфигурации HDFS, т. е. если размер блока составляет 64 МБ, ваш общий файл будет разделен на такие блоки и распределен по кластеру Hadoop. Spark будет генерировать задачи в соответствии с вашей конфигурацией num.executors, чтобы решить, сколько параллельных задач может быть выполнено. Ожидайте no_of_hdfs_blocks=no_of_total_tasks.

Далее важно то, как вы обрабатываете логику этих данных, выполняете ли вы какое-либо перетасовку данных, что-то похожее на перераспределение (*), которое будет перемещать данные по кластеру и изменять номер раздела для обработки вашим искровым заданием.

ХТХ!

person AbhishekN    schedule 27.07.2018
comment
128 МБ сейчас по умолчанию, я думаю - person thebluephantom; 27.07.2018
comment
Хорошо объяснили, теперь понятно, как Spark обрабатывал большое файловое хранилище в HDFS, разбитое по размеру блока. У меня есть одно сомнение: вместо того, чтобы хранить большой файл в HDFS, если мы храним его на S3 или сетевом диске, тогда в этом случае файл не будет разбит на разделы, так как Spark будет обрабатывать этот файл. Может кто-нибудь объяснить этот сценарий. - person Atanu chatterjee; 07.03.2021