开发者社区> 问答> 正文

LM计算引擎 Cache Table是什么?

在ADS的FRONTNODE节点构建本地local的内置DB引擎,能够存储一定量的本地数据缓存表(Cache Table),进行快速本地单表查询。基于Cache table,可进行一定范围内的高效的分页数据查询。

实现方案介绍

  • 存储:Cache Table存储在FRONTNODE本地节点上,每个节点上有多个Cache Table存储分桶,桶内采取换入换出机制,每个FRONTNODE上最大能容纳的Cache Table数据量为 256MB * FRONTNODE所在物理机的总核数 ;从业务角度来说,Cache Table为临时存储,不能作为永久性存储,主要用来加速局部数据复用查询和分页查询。
  • 查询:Cache Table只支持单表查询。
  • 管理:业务要通过捕获相应SQLException异常错误码,来感知Cache Table的失效,并决定是否进行重建。后续ADS会涉及Cache Table的自管理方案。目前业务方需要从业务侧维护Cache ID与Cache Table之间的映射。


使用介绍



1)创建Cache Table:


创建Cache Table的Sample语句:<PRE prettyprinted? linenums>
  1. CREATE TABLE cache.table_name OPTIONS(cache=true) AS SELECT * FROM yt_vip_user_tag LIMIT 200;

其中table_name为业务定义的Cache Table名, AS后面为结果需要存入Cache Table的查询语句。 成功执行后,会返回单列一行数据: cache_id ,用来唯一标识这张位于某台特定FRONTNODE节点上Cache Table:<PRE prettyprinted? linenums>
  1. CREATE TABLE cache.test_cache_table_1 OPTIONS(cache=true) AS SELECT * FROM yt_vip_user_tag LIMIT 200;
<PRE prettyprinted? linenums>
  1. +---------------------------------------------+
  2. | cache_id                                    |
  3. +---------------------------------------------+
  4. | 1683065103.38806.6.0.082539                 |
  5. +---------------------------------------------+

后续查询这张表,都需要带上cache_id的HINT进行查询。

2)单个Cache Table行数限制:


Cache Table单表存储的最大行数限制在 300000行。 假设select * from yt_vip_user_tag查询会返回999999行数据,若针对该查询结果创建Cache Table,会报错,错误码为 18066 ,错误消息为:” EXECUTE_CREATE_CACHE_TABLE_ERROR message=Exceed the max cache table row limitation: 300001”。:<PRE prettyprinted? linenums>
  1. mysql> CREATE TABLE cache.test_cache_table_1 OPTIONS(cache=true) AS select * from yt_vip_user_tag;
  2. ERROR 18066 (HY000): Error code: 18066, message: EXECUTE_CREATE_CACHE_TABLE_ERROR message=Exceed the max cache table row limitation: 300001

注意:创建Cache Table查询的SELECT语句不要加LIMIT子句,为保证创建Cache Table的查询结果集行数在限制( 300000 )以内,可以预先执行:<PRE prettyprinted? linenums>
  1. SELECT count(*) FROM (SELECT * FROM yt_vip_user_tag WHERE col1 = 2);

来确保创建该Cache Table的查询结果集在限制以内。

3)查询Cache Table:


每张Cache Table对应一个自己唯一的 Cache ID (创建时产生),每次查询Cache Table时,都需要带上该 Cache ID 的hint,例如:<PRE prettyprinted? linenums>
  1. /*+cache_id=1683065103.38806.6.0.082539*/select * from cache.test_cache_table_1;

Cache Table支持分页查询,例如:<PRE prettyprinted? linenums>
  1. /*+cache_id=1683065103.38806.6.0.082539*/select * from cache.test_cache_table_1 limit 10, 5;

Note
注意:在使用Cache Table实现分页方案时,生成的Cache Table仅仅为单表,最佳实践是仅仅对生成的Cache Table进行分页明细数据查询,请勿针对Cache Table进行复杂聚合计算和窗口函数分析查询。


4)查询Cache Table时的异常处理:


查询Cache Table异常分两种类型,查询本身的用户异常,即用户查询写错了,该类 SQLException 异常的错误码为 30018 ,用户需要检查查询是否正确; 另外一类,是Cache Table系统异常,该类 SQLException 异常的错误码为 30016 ,遇到 30016 ,用户需要考虑重建Cache Table。该类异常发生原因有:
  • FRONTNODE节点重启、发布升级导致位于该FRONTNODE节点上的Cache Table失效;
  • FRONTNODE节点上用来容纳Cache Table的bucket满,触发了换出的淘汰机制,导致目标Cache Table失效。


5)删除Cache Table:


业务可以删除指定的Cache Table,和查询一样,需要指定对应的Cache ID:<PRE prettyprinted? linenums>
  1. /*+cache_id=1683065103.38806.6.0.082539*/drop table cache.test_cache_table_1;

展开
收起
nicenelly 2017-10-26 15:23:48 2432 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
Scaling 30 TB’s of Data Lake with Apache HBase and Scala DSL at Production 立即下载
Scaling 30 TB\'s of Data lake with Apache HBase and Scala DSL at Production 立即下载
Get rid of traditional ETL, Move to Spark! 立即下载