Мы кэшировали таблицы в Spark Thrift Server. Данные кешируются еженедельно:
cache table event_2018_12_1 as select * from ... where ...;
cache table event_2018_12_2 as select * from ... where ...;
Поскольку мы постоянно обновляем наши исходные данные (Cassandra), нам необходимо обновить кэш:
refresh table event_2018_12_1;
select count(*) from event_2018_12_1;
refresh table event_2018_12_2;
select count(*) from event_2018_12_2
Операция обновления выполняется лениво, поэтому мне нужно запустить обновление с помощью операции count(*)
.
Проблема заключается в том, что другие клиенты выбирают данные из кэшированной таблицы в то же время, когда они обновляются - Выбор зависает до тех пор, пока кэш полностью не обновляется (на завершение требуется несколько минут).
Я бы хотел асинхронно обновлять кэш и открывать свежие данные только после завершения загрузки (аналогично поведению LoadingCache
в guava).
Как мне добиться этого в Spark?
Возможное решение:
Создать представление как слой над кэшированными таблицами:
create or replace TEMPORARY VIEW event_2018_10 as
select * from event_2018_12_1
union all select * from event_2018_12_2
Вместо обновления просто создайте новый кэш и замените представление:
cache table event_2018_12_1_c1 as select * from ... where ...;
create or replace TEMPORARY VIEW event_2018_10 as
select * from event_2018_12_1_c1
union all select * from event_2018_12_2;
--after some delay drop the first cache
drop table event_2018_12_1;
Я обеспокоен изменением DDL представления и одновременным выбором. Может ли что-то пойти не так?