Sparklyr: Как избежать разлива на диск при вычислении новых таблиц с небольшим объемом доступной памяти? - PullRequest
0 голосов
/ 19 июня 2019

В настоящее время я работаю над набором данных объемом 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, который мне не кажется эффективным.

Есть ли лучший способ сделать это?

Или я могу просто настроить свою конфигурацию иначе, чтобы не пролить?

Спасибо.

...