kylin中元数据现状
- 在kylin-3.0中,元数据存储分为两种:Hbase和HDFS。默认情况下单条记录超过10M会存储在HDFS上(kylin.properties中配置的kylin在HDFS路径)
- kylin中元数据分类;
- 源码:(module:core-common) org.apache.kylin.common.persistence.ResourceStore;
- 具体分类详见如下:
// cube基本信息
public static final String CUBE_RESOURCE_ROOT = "/cube";
// cube 的维度、度量值、聚合组等信息
public static final String CUBE_DESC_RESOURCE_ROOT = "/cube_desc";
// model的数据信息
public static final String DATA_MODEL_DESC_RESOURCE_ROOT = "/model_desc";
// cube build过程中所需要的 dict类,
public static final String DICT_RESOURCE_ROOT = "/dict";
// project 信息
public static final String PROJECT_RESOURCE_ROOT = "/project";
// project中所加载的hive表快照
public static final String SNAPSHOT_RESOURCE_ROOT = "/table_snapshot";
//
public static final String TABLE_EXD_RESOURCE_ROOT = "/table_exd";
//
public static final String TEMP_STATMENT_RESOURCE_ROOT = "/temp_statement";
public static final String TABLE_RESOURCE_ROOT = "/table";
public static final String EXTERNAL_FILTER_RESOURCE_ROOT = "/ext_filter";
public static final String HYBRID_RESOURCE_ROOT = "/hybrid";
// job信息
public static final String EXECUTE_RESOURCE_ROOT = "/execute";
// job对应的task信息,与 /excute 相关联
public static final String EXECUTE_OUTPUT_RESOURCE_ROOT = "/execute_output";
public static final String STREAMING_RESOURCE_ROOT = "/streaming";
public static final String STREAMING_V2_RESOURCE_ROOT = "/streaming_v2";
public static final String KAFKA_RESOURCE_ROOT = "/kafka";
public static final String STREAMING_OUTPUT_RESOURCE_ROOT = "/streaming_output";
public static final String CUBE_STATISTICS_ROOT = "/cube_statistics";
// 慢查询
public static final String BAD_QUERY_RESOURCE_ROOT = "/bad_query";
public static final String DRAFT_RESOURCE_ROOT = "/draft";
// 用户
public static final String USER_ROOT = "/user";
public static final String EXT_SNAPSHOT_RESOURCE_ROOT = "/ext_table_snapshot";
public static final String METASTORE_UUID_TAG = "/UUID";
kylin元数据备份
- 脚本路径: ${KYLIN_HOME}/bin/metastore.sh,功能项共有如下几种:
echo "usage: metastore.sh backup [RESOURCE_PATH_PREFIX]"
echo " metastore.sh fetch DATA"
echo " metastore.sh reset"
echo " metastore.sh refresh-cube-signature"
echo " metastore.sh restore PATH_TO_LOCAL_META [RESOURCE_PATH_PREFIX]"
echo " metastore.sh list RESOURCE_PATH"
echo " metastore.sh cat RESOURCE_PATH"
echo " metastore.sh remove RESOURCE_PATH"
echo " metastore.sh clean [--delete true]"
exit 1
- 具体的可以看以下脚本,kylin-3.0相对于2.6.x增加了几个功能项;可以根据源码好好的研究一下;
kylin元数据存储方式
- 在源码中关于元数据读取代码在module:core-common中。基础的代码为:
org.apache.kylin.common.persistence.ResourceStore
(这是一个抽象类 abstract);和resource相关的都会extend(继承) ResourceStore。
- 元数据在HDFS上存储,方法名为
org.apache.kylin.common.persistence.HDFSResourceStore
,会重写ResourceStore
中的方法;
- 元数据在HBase中存储为kylin_metadata(默认表名),方法名为:
org.apache.kylin.storage.hbase.HBaseResourceStore
,此方法(HBaseResourceStore
)继承了org.apache.kylin.common.persistence.PushdownResourceStore
,而 方法PushdownResourceStore
继承了方法ResourceStore
; (具体的可以读一下源码);
- 具体的读取方法建议阅读一下 方法
org.apache.kylin.storage.hbase.HBaseResourceStore#visitFolder
;
- HBase中读取不到的元数据(HBase中仅存储small resource,小于10M),会下压到HDFS查询;
- 元数据在Hbase或hdfs中以json的形式存在,在HBase中rowkey就是文件路径;具体可以参考官网 meatadata释义,kylin-3.0: 备份元数据
kylin元数据在HBase中存储
- kylin元数据在HBase中存储表:kylin_metada(默认表),详见方法
org.apache.kylin.storage.hbase.HBaseResourceStore
;表列族为f
,表 列为:c
-存储json内容 和t
-13为unix时间戳,用于scan时辅助过滤;
- 表结构如下:
hbase(main):002:0> describe 'kylin_metadata'
Table kylin_metadata is ENABLED
kylin_metadata
COLUMN FAMILIES DESCRIPTION
{NAME => 'f', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', C
ACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLO
OMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'true', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN
=> 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
1 row(s)
Took 0.2236 seconds
- 可以从表结构中看出,因
IN_MEMORY => 'true'
,所以整个元数据表会缓存到内存中;
kylin元数据在HDFS中存储
# 表的基数
/kylin/kylin_metadata/cardinality
# HBase的协同处理器
/kylin/kylin_metadata/coprocessor
# 超过10m的资源,存储在hdfs上,快照表、字典、cube_statistics
/kylin/kylin_metadata/resources
# 存储cube的rowkey和cuboid信息
/kylin/kylin_metadata/kylin-job-uuid
- 问:HDFS 上的工作目录中文件超过了 300G,可以手动删除吗?
- 答:官网回答:kylin-常见问题-官网
- HDFS 上的工作目录中的数据包括了中间数据 (将被垃圾清理所清除) 和 Cuboid 数据 (不会被垃圾清理所清除),Cuboid 数据将为之后的 Segment 合并而保留。所以如果用户确认这些 Segment 在之后不会被合并,可以将 Cuboid 数据移动到其他路径甚至删除。
- 另外,请留意 HDFS 工作目录下的 “resources” 或 “jdbc-resources” 子目录中会存放一些大的元数据,如字典文件和维表的快照,这些文件不能被删除。
网友评论