В настоящее время я работаю над набором данных объемом 6 ГБ с sparklyr 1.0 в локальном режиме, запущенным на виртуальной машине с 26 ГБ оперативной памяти и 4 ядрами, но в конечном итоге цель состоит в том, чтобы иметь возможность выполнить всю подпрограмму в кластере для обработки Набор данных 100 ГБ.
Я устанавливаю процесс проверки набора данных, который приводит к созданию группы промежуточных таблиц.
Чтобы ускорить вычисления, я кэширую некоторые из этих таблиц в памяти, но из-за ограниченного объема памяти происходит разлив на диске, который значительно замедляет вычисления, и я пытаюсь ограничить его.
Наиболее ресурсоемкая часть - это когда я создаю таблицу 6 ГБ из другой таблицы 6 ГБ, которую мне нужно кэшировать, потому что позже я делаю много вычислений.
Код выглядит так:
table1 <- spark_read_csv(..., memory = T)
...
table2 <- Some calculations based on table1
...
sdf_register(sc,table2)
tbl_uncache(sc,table1)
tbl_cache(sc,table2)
Моя конфигурация:
conf <- spark_config()
conf["spark.serializer"] <- "org.apache.spark.serializer.KryoSerializer"
conf["sparklyr.shell.driver-memory"] <- "16G"
conf["spark.sql.shuffle.partitions"] <- 12L
conf["spark.memory.fraction"] <- 0.90
conf["spark.memory.storagefraction"] <- 0.80
sc <- spark_connect(master = "local", config = conf)
Разлив происходит либо во время вычислений, так как я полагаю, что выполнение забирает память из памяти, которая вызывает разлив на диске, либо во время кэширования таблицы 2, которую я пытаюсь избежать, сначала отсеивая.
Но, глядя на задания, сгенерированные этим кодом, похоже, что table2 вычисляется для sdf_register и снова для tbl_cache, который мне не кажется эффективным.
Есть ли лучший способ сделать это?
Или я могу просто настроить свою конфигурацию иначе, чтобы не пролить?
Спасибо.