概要描述
MetaCache 是在 metastore 之上添加的功能,在 Inceptor Server 端增加一个对 Metastore 中数据的 cache,在高并发场景下来减少 server 跟 metastore 通信的次数,提高SQL执行效率;
在设置 ngmr.metacache.level=server
前提下,当多个 server 共享同一个metastore时,如果一个server对一个table的metadata进行了修改,另外的server在访问更新后的metadata时,如果该信息被缓存至 cache,会因 cache 未更新导致数据不一致报错,除非重启该 server 或者等待cache 过期(默认时间为1小时,ngmr.metacache.server.timeout.ms=3600000
)。
所以,set ngmr.metacache=true;
仅限于高并发测试场景下适用,不适用于多个Inceptor Server共用一个Metastore的场景
设置 metacache 级别:set ngmr.metacache.level={none, statement, server}
- 当设置为stagement时,表示仅对当前session进行Meta的缓存
- 当设置为server时,表示对server上所有任务都开启Meta的缓存,因此当DDL有变化是,需要更新缓存的Meta信息
本文介绍,如何通过refreshmetacache
命令,在不重启server的情况下,清空server中对应的cache。
详细说明
测试环境:
argodb 5.2.3 + 最新patch
我们有Quark1和Quark2两个组件,Quark2共享了Quark1的metastore,
Step1, Quark1下创建测试表
DROP TABLE IF EXISTS testmetacache;
CREATE TABLE testmetacache (id INT,name string) STORED AS HOLODESK;
Step2,Quark2查询表,保证server将table的metadata cache住
--ngmr.metacache.level参数,默认值是statement,所以这里会成功cache住
--set ngmr.metacache.level=statement
select * from testmetacache;
Step3,Quark1新增列
--对测试表新增列
ALTER TABLE testmetacache ADD COLUMNs (age int);
Step4,Quark2查询表报错
--开启server的metacache
set ngmr.metacache.level=server;
--查询报错
select * from testmetacache;
Step5,Quark2执行refreshmetacache操作
--该操作将清除metacache中对应的table, table partition, Privilege
refreshmetacache table default.testmetacache;
--只输入tblName,dbName默认为当前session所使用的database
use default;
refreshmetacache table testmetacache;
--该操作将清除metacache中对应的dbName, dbName所在的table, table partition, Privilege
refreshmetacache database default;
--该操作清除所有的metacache, 建议当有元信息改动时,开了server cache的server无法读取到改动时使用
refreshmetacache all
执行上述任意一个命令即可,再次查询表,正常。