Возможно ли, что в тех случаях, когда Spark не находит кэшированные данные (сбой при поиске в кэше), он поднимается по линии и запускает запрос Cassandra?
Да, это возможно.Кэшированные данные могут быть удалены очистителем кэша (в основном в режиме MEMORY_ONLY
), могут быть потеряны при выводе из эксплуатации соответствующего узла (сбой, прерывание, освобождение при динамическом выделении).Кроме того, другие параметры, такие как спекулятивное выполнение, могут влиять на поведение кэша.
Наконец, данные могут не полностью кэшироваться с самого начала.
Если да, то как этого избежать ввсе случаи?
Не используйте cache
/ persist
, если вам требуются строгие гарантии согласованности - он не был разработан с учетом вариантов использования, подобных этому.Вместо этого экспортируйте данные в постоянное надежное хранилище (например, HDFS) и читайте их оттуда.
Вы также можете использовать checkpoint
с HDFS checkpointDir
.
У вас может возникнуть желание использоватьболее надежный режим кэширования, такой как MEMORY_AND_DISK_2
- это может снизить вероятность повторного вычисления данных за счет
df.rdd.cache ().Отличается ли это от вызова cache () на фрейме данных?
Это отличается (основное отличие - стратегия сериализации), но не в том, что касается свойств, представляющих интерес в области действия.этого вопроса.
Важно :
Обратите внимание, что поведение кэширования может быть не самой большой проблемой в вашем коде.Чтение из одной таблицы и добавление ее в одну таблицу может привести к нежелательному или неопределенному поведению всех типов в сложных конвейерах, если только не предприняты дополнительные шаги, чтобы убедиться, что читатель не выбирает вновь записанные записи.