Запустит загрузку данных в память, если объем данных составляет 10 ГБ, а объем оперативной памяти - 1 ГБ. - PullRequest
0 голосов
/ 30 марта 2019

Если у меня есть кластер из 5 узлов , каждый узел имеет 1 ГБ оперативной памяти , теперь, если мой файл данных 10 ГБ распределен ввсе 5 узлов, скажем, по 2 ГБ в каждом узле, теперь, если я активирую

val rdd = sc.textFile ("filepath")

rdd.collect

вызовет загрузкуданные в оперативную память и то, как искра будет справляться с этим сценарием, сразу же откажется или обработает.

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Давайте сначала разберемся с вопросом @intellect_dp, у вас есть кластер из 5 узлов (здесь термин «узел», я предполагаю машину, которая обычно включает в себя жесткий диск, оперативную память, 4-ядерный процессор и т. Д.), Теперь каждый узел имеет 1 ГБ ОЗУ и у вас есть 10 ГБ файла данных, который распределен таким образом, что 2 ГБ данных находятся на жестком диске каждого узла.Здесь давайте предположим, что вы используете HDFS, и теперь ваш размер блока на каждом узле составляет 2 ГБ.

теперь давайте разберем это:

  • размер каждого блока = 2 ГБ
  • Объем ОЗУ каждого узла = 1 ГБ

Из-за ленивых вычислений в spark только при запуске «Action API» только он загрузит ваши данные в ОЗУ и выполнит их дальше.

здесь вы говорите, что используете "коллекционирование" как действие API.Теперь проблема заключается в том, что размер ОЗУ меньше размера вашего блока, и если вы обрабатываете его со всей конфигурацией по умолчанию ( 1 блок = 1 раздел ) spark и с учетом того, что больше ни один узел не будет добавлентогда в этом случае возникнет исключение из-за нехватки памяти.

теперь вопрос - есть ли способ, с помощью которого spark может обрабатывать большие объемы данных с данным типом аппаратного обеспечения?

Ответ - да, сначала вам нужно установить минимальный раздел по умолчанию:

val rdd = sc.textFile ("filepath", n)

здесь n будет моим значением по умолчаниюминимальный раздел блока, теперь, когда у нас есть только 1 ГБ ОЗУ, поэтому нам нужно оставить его менее 1 ГБ, поэтому предположим, что мы берем n = 4, теперь, когда ваш размер блока равен 2 ГБ, а минимальный раздел блока равен 4:

размер каждого раздела будет равен = 2 ГБ / 4 = 500 МБ;

теперь спарк обработает эти 500 МБ сначала и преобразует их в СДР, когда придет следующий кусок в 500 МБ,первый случай будет разлитна жесткий диск (учитывая, что вы установили уровень хранения «MEMORY_AND_DISK_ONLY» ).

Таким образом он обработает все ваши 10 ГБ файла данных с заданной конфигурацией аппаратного обеспечения кластера.

Теперь я лично не буду рекомендовать данное аппаратное обеспечение для такого случая, так как оно определенно будет обрабатывать данные, но есть несколько недостатков:

  • во-первых, это будет включать несколькоОперация ввода-вывода делает весь процесс очень медленным.

  • Во-вторых, если произойдет задержка при чтении или записи на жесткий диск, вся ваша работа будет отброшена, вы будете разочарованы таким оборудованиемконфигурации.В дополнение к этому вы никогда не будете уверены, что запустят обработку ваших данных и смогут дать результат, когда данные будут увеличиваться.

Так что постарайтесь сохранить очень меньше операций ввода-вывода,Использование вычислительных мощностей искры в памяти с добавлением нескольких ресурсов для повышения производительности.

1 голос
/ 30 марта 2019

При использовании собирать все отправляемые данные собираются как массив только в узле драйвера.С этой точки распределение искры и других узлов не играет роли.Вы можете думать об этом как о чистом Java-приложении на одной машине.

Вы можете определить память водителя с помощью spark.driver.memory и запросить 10G.

С этого момента, если вам не хватитпамяти для массива вы, вероятно, получите исключение OutOfMemory.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...