Spark обновление кеш-таблицы асинхронно - PullRequest
0 голосов
/ 09 января 2019

Мы кэшировали таблицы в 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 представления и одновременным выбором. Может ли что-то пойти не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...