Чем отличаются Spark RDD и DataFrames в том, как они загружают данные в память?

RDD полезны, поскольку они позволяют пользователям обрабатывать данные на уровне "строки" (или отдельного объекта json и т. д.) без необходимости загружать все данные в память. Драйвер выясняет, как распределять распределенные данные (или указатели на них) по рабочим процессам, и каждый раздел успешно выполняет код для каждой строки/строки/объекта. Затем, не собирая данные в драйвере, я могу сохранить результат каждого раздела в отдельный текстовый файл.

Фреймы данных. Как это работает? Я подозреваю, что это не то же самое, потому что я могу нормально обрабатывать журналы сервера за месяц с небольшим кластером из 8 узлов, используя RDD, но как только я попытаюсь даже загрузить распределенные данные с sql_context(spark_context).sql.read.json(s3path) в a DataFrame он выдает всевозможные ошибки нехватки памяти, и задание прерывается. Набор данных точно совпадает с тем, который RDD выполняет должным образом, тот же кластер, тот же период времени.

Есть ли разница в том, как RDD и DataFrames обрабатывают загрузку памяти, в смысле, который может объяснить мои результаты? Пожалуйста, помогите мне понять различия между RDD и DataFRame, которые могут влиять на эти результаты. Спасибо.


person xv70    schedule 27.07.2016    source источник


Ответы (1)


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

sql_context(spark_context).sql.read.json(s3path)

Этот код соответствует документация, если вы не дадите схему, искра будет очень глубоко проникать в ваш json, чтобы найти типы для создания RDD. Это работает так же, как inferSchema в загрузке CSV библиотеки блоков данных.

Итак, что я могу вам порекомендовать:

  • Добавление схемы Json с помощью sql.types
  • Или, поскольку я знаю, что это действительно накладные расходы, используйте этот метод и после этого используйте toDF()

Ну, это возможная проблема, с которой вы столкнулись. У меня не было проблем с OOM, но мне потребовались минуты, чтобы загрузить что-то, что с RDD действительно быстро.

person Thiago Baldim    schedule 28.07.2016
comment
Спасибо, это действительно правильный ответ: если вы не укажете схему, Spark загрузит данные для ее вывода, что приведет к чрезмерным накладным расходам памяти для больших кадров данных. Поскольку моя схема представляет собой очень длинный и запутанный вложенный объект json, я написал функцию, которая выполняет запрос минимального количества данных, извлекает «схему», а затем передает ее в качестве второго аргумента, например sql_context(spark_context).sql. .read.json(s3path, схема=схема). Это решило проблему, еще раз спасибо. - person xv70; 01.08.2016