2016-11-22 6 views
10

Мы все знаем, что Spark выполняет вычисления в памяти. Мне просто интересно, как это сделать.Spark RDD - это раздел (ы) всегда в ОЗУ?

  1. Если я создаю 10 RDD в моей pySpark оболочке из HDFS, это означает, что все эти 10 RDD сек данных будут находиться на Спарк рабочей памяти?

  2. Если я не удалю RDD, это будет в памяти навсегда?

  3. Если размер моего файла (файла) превышает объем оперативной памяти, где будут храниться данные?

+0

В памяти есть да RAM. RDD ленивы. В RDD есть 2 операции, называемые преобразованиями и действиями, если не принято действие (для ex: count), которое они не будут действовать и вычислять. При запуске задания мы будем выделять память (которая является памятью исполнителей в ОЗУ) через spark-submit или каким-либо другим способом. Порекомендовал бы [это] (https://www.tutorialspoint.com/apache_spark/apache_spark_rdd.htm) –

ответ

15

Если я создаю 10 RDD в моей pySpark оболочке из HDFS, это означает, что все эти 10 РДД данные будут находиться на Спарк памяти?

Да, Все 10 РДУ данные будут распространяться в искровых рабочих машин RAM. но не обязательно для всех машин, должен иметь раздел каждого RDD. выключение RDD будет иметь данные в памяти только в том случае, если какое-либо действие выполняется на нем, так как оно лениво оценивается.

Если я не удаляю RDD, это будет в памяти навсегда? не

Спарк Автоматически unpersist ДРР или Dataframe, если они больше не используются. Чтобы узнать, кэшируется ли RDD или Dataframe, вы можете войти в таблицу Spark UI -> Storage и просмотреть сведения о памяти. Вы можете использовать df.unpersist() или sqlContext.uncacheTable("sparktable"), чтобы удалить df или таблицы из памяти. link to read more

Если мой размер набора данных превышает размер доступной оперативной памяти, где данные в будут сохранены?

Если РДД не помещается в памяти, некоторые разделы не будут кэшироваться и будут пересчитаны на лету каждый раз, когда они необходимы. link to read more

Если мы говорим РДД уже в оперативной памяти, а это означает, что в памяти, что необходимость сохраняться()? --as на комментарий

Чтобы ответить на ваш вопрос, когда любое действие срабатывает на РДУ, и если это действие не может найти память, она может удалить некэшированный/unpersisted РДА.

В общем, мы сохраняются RDD, которые нужно много вычислений и/или перетасовки (по умолчанию искра не проходят перемешиваются РДУ, чтобы избежать дорогостоящей сети I/O), так что, когда любое действие, совершаемое на сохранялось RDD, просто он будет выполнять это действие, а не вычислять его снова с начала в соответствии с графиком линии, check RDD persistence levels here.

+0

Выглядит лучше. Следует упомянуть, что не требуется хранить все данные в памяти в любое время. –

+0

@mrsrinivas - «Да, все 10 данных RDD будут распространяться в оперативной памяти искровых работников» (после выполнения действия) - если это так, зачем нам отмечать RDD, который нужно сохранить, используя persist() или cache() на нем? – Dipankar

+1

Мы сохраняем/кешируем rdds, чтобы избежать повторных операций/задач cpu/memory/io снова на следующих этапах. – mrsrinivas

6

Если я создаю 10 RDD в моей Pyspark оболочке, это означает, что все эти 10 РДД данные будут находиться на Спарк памяти?

Ответ: RDD содержит только «граф линий» (применяемые преобразования). Итак, RDD - это не данные !!! Когда мы выполняем любое действие на RDD, все преобразования применяются перед действием. Так что если явно (конечно, есть некоторые оптимизации, кешированные неявно) кэшированные, каждый раз, когда действие выполняется, все преобразование и действие выполняются снова !!!

E.g - Если вы создаете RDD из HDFS, примените некоторые преобразования и выполните 2 действия на преобразованном RDD, чтение и преобразования HDFS будут выполнены дважды !!!

Итак, если вы хотите избежать повторных вычислений, вам необходимо сохранить RDD. Для сохранения у вас есть выбор комбинации одного или нескольких из HEAP, Off-Heap, Disk.

Если я не удаляю RDD, это будет в памяти навсегда?

Ответ: Учитывая, что RDD является только «графиком линии», он будет следовать тому же правилу сферы действия и срока службы языка хостинга. Но если вы уже сохранили вычисленный результат, вы можете отменить его!

Если размер моего набора данных превышает объем оперативной памяти, где будут храниться данные?

Ответ: Предполагая, что вы на самом деле сохраняли/кэшировали RDD в памяти, он будет сохранен в памяти. И LRU используется для высылки данных. Refer для получения дополнительной информации о том, как управление памятью выполняется в искровом режиме.

+0

Предполагая, что требуется только одно чтение, преобразование и действие HDFS, и если вычислительный набор, который должен быть вычислен, содержит три раза больше ОЗУ, как данные в разделах RDD загружаются в память для вычисления Spark? – Kannan

+0

Работник должен иметь буфер для хранения данных одного раздела и буфер, необходимый для обработки данных, другой мудрый рабочий сбой! Стратегия разделения должна принять это во внимание !!! – rakesh

+0

Спасибо Ракешу за разъяснение. Таким образом, размер буфера должен быть больше, чем по меньшей мере один размер раздела. Есть ли какая-либо ссылка, которая дает мне больше информации об этом? Еще раз спасибо. – Kannan