ClickHouse11-ClickHouse中文件引擎与物化视图的组合拳

ClickHouse

Posted by Claire on March 18, 2024

文件引擎其实是一个不常用的特殊表引擎,结合文件引擎的基础介绍

这边有一个需求:ClickHouse的日志数据存储在表中,不像其他数据库引擎有文件中的日志,能够方便同步和分析,那现在就想仿照其他数据库,将ClickHouse的查询日志表中数据部分过滤同步到文件中,便于其他日志组件将数据汇聚一起分析

table: query_log ---> filter comment with sql ---> create MATERIALIZED view ---> save into files

这边还需要引入一个概念:物化视图

什么是物化视图

物化视图(Materialized View)是一种特殊类型的表 它能够根据定义在其上的SQL查询结果自动更新数据 它并不存储查询表达式本身,而是实际计算和存储了该查询的结果集 当源表有新的数据插入、修改或满足特定条件时,物化视图会实时或者按照配置的策略执行预定义的聚合或其他计算,并将结果写入到物化视图对应的表中

使用场景

  • 通过Select请求聚合并查询数据
  • 在写入时将数据准备为新格式
  • 在写入到特定聚合时准备数据

比较常见的使用:按月、按年分表同步,针对原始表按照指标定期做数据聚合产生中间统计表等

如何实现这个需求

建立一个使用表引擎的表,作为物化视图的目标表

CREATE TABLE default.query_log_file
(
    `event_time` DateTime,
    `user` LowCardinality(String),
    `query_id` String,
     `read_rows` UInt64,
    `read_bytes` UInt64,
    `result_rows` UInt64,
    `result_bytes` UInt64,
    `memory_usage` UInt64,
    `exception` String
)
ENGINE = File(TabSeparated);

确定需要查询的SQL

SELECT   
    event_time,   
    user,   
    query_id AS query,   
    read_rows,   
    read_bytes,   
    result_rows,   
    result_bytes,   
    memory_usage,   
    exception  
FROM clusterAllReplicas('cluster_name', system, query_log)  
WHERE (event_date = yesterday()) AND query_duration_ms > 30000 AND (is_initial_query = 1) AND (query NOT LIKE 'INSERT INTO%')  
ORDER BY query_duration_ms desc  
LIMIT 100

创建物化视图

CREATE MATERIALIZED VIEW query_log_file_view TO default.query_log_file AS 
SELECT 
  event_time,   
    user,   
    query_id,   
    read_rows,   
    read_bytes,   
    result_rows,   
    result_bytes,   
    memory_usage,   
    exception  
FROM system.query_log
WHERE query_duration_ms > 3 AND (is_initial_query = 1) AND (query NOT LIKE 'INSERT INTO%') 

测试

产生测试数据:执行一些查询、alter语句,最好是慢查询,查看是否被视图捕获,查看是否写入文件 如果写入文件,那么后续的采集就基于文件来处理即可,按周写入的format来解析


如果喜欢我的文章的话,可以去GitHub上给一个免费的关注吗?