Проблема
У меня есть рабочий код, и даже производительность достаточно для моих целей.
Фактическая проблема - потребление памяти .
Если несколько пользователей одновременно запускают код, память кластера Databricks заполняется быстро до тех пор, пока не выйдет из строя и не будет перезагружена.
Поскольку мы изменили код, чтобы использовать данные Spark, кадры потребляют память работает намного лучше в кластере.
Но теперь время обработки стало ужасно медленным, и я хотел бы выполнять обработку параллельно.
Вопрос
Но я не знаю, как к этому подойти.
Сначала я изучил семейство функций apply()
, но они ожидают, что с этим будет работать фрейм данных, а затем он может быть обработан указанным пользователем. function.
В моем случае проблема, которую нужно решить, - это наоборот. У меня еще нет фрейма данных, я хочу построить его с моими данными.
Приведенный ниже код создает множество небольших фреймов данных , которые в конечном итоге необходимо объединить в один большой фрейм данных .
Так что я, кажется, смотрю на неправильные места.
=> Какой лучший R-подобный / искровой подход поможет обоим уменьшить объем памяти и обеспечить ее нормальную работу?
Код
Каждая генерируемая строка данных и столбец полностью независимы от других.
Мой текущий подход заключается в следующем:
- Генерация данных каждого столбца.
- Затем объединение их в фрейм данных.
- Создание фрейма данных Spark на основе этого локального фрейма данных
- Возвращает фрейм данных Spark.
Затем вызывающий код объединяет возвращенные фреймы данных с SparkR::union()
в один фрейм данных.
Упрощенный пример:
Simulate <- function(someData) {
data1 <- generator1(someData)
data2 <- generator2()
local_frame <- data.frame(
column1 = data1,
column2 = data2
)
spark_frame <- SparkR::createDataFrame(local_frame)
return (spark_frame)
}