Clickhouse 官网地址:
ClickHouse是一个由俄罗斯的Yandex于2016年开源的面向OLAP(联机分析处理)的列式数据库管理系统(DBMS)。它采用C++语言开发,以卓越的查询性能著称,并且在基准测试中超越了众多主流的列式数据库。
ClickHouse的特点和应用优势
- 列式存储:ClickHouse采用列式存储方式,对于列的聚合、计数、求和等统计操作,其性能优于行式存储。同时,由于某一列的数据类型都是相同的,这使得数据压缩更为高效,可以节省磁盘空间并提高cache的利用率。
- 高性能:ClickHouse充分利用所有可用的硬件资源,以尽可能快地处理每个查询。其单个查询(解压缩后,仅使用的列)的峰值处理性能超过每秒2TB。此外,ClickHouse集群的每台服务器每秒能处理数亿到十亿多行和数十千兆字节的数据。
- 实时查询:ClickHouse允许使用类SQL实时查询生成分析数据报告,这对于需要快速响应的在线分析场景非常有用。
- 多样化引擎:ClickHouse提供了丰富的数据类型、数据库引擎和表引擎,以满足不同场景的需求。
- 简单易用:ClickHouse的安装和维护相对简单,同时支持跨数据中心部署,方便用户进行扩展和管理。
应用场景
ClickHouse数据库的应用场景主要集中在那些需要高效处理和分析大量数据的领域。
- 商业智能(BI):ClickHouse常被用于商业智能领域,为企业提供实时的数据分析和报告功能。它能够处理大量的数据,并快速生成分析结果,帮助企业做出更明智的决策。
- 广告流量和Web/App流量分析:对于需要分析大量广告流量或Web/App用户行为的场景,ClickHouse能够高效地处理这些数据,并提供详细的用户行为分析报告,帮助企业优化广告策略或提升用户体验。
- 电信行业:电信行业需要处理大量的通信数据,包括通话记录、用户信息等。ClickHouse能够高效地存储和查询这些数据,为电信企业提供实时的数据分析服务。
- 金融领域:金融行业对数据的实时性和准确性要求极高。ClickHouse能够处理金融交易数据、用户行为数据等,为金融机构提供实时的风险控制和决策支持。
- 电子商务:电子商务企业需要分析用户的购物行为、商品销售情况等数据,以优化商品推荐、提升用户体验。ClickHouse能够快速处理这些数据,并生成相应的分析报告。
- 信息安全和日志分析:对于需要分析大量日志数据以检测潜在安全威胁的场景,ClickHouse能够提供高效的日志处理和分析能力,帮助企业及时发现并应对安全风险。
- 网络游戏和物联网:网络游戏和物联网领域也产生了大量的数据需要处理和分析。ClickHouse能够应对这些领域的数据处理需求,为企业提供实时的数据分析和价值挖掘服务。
操作数据库
1. 本地表 - 用来批量写数据使用,通常后缀带_local标识
CREATE TABLE pricing.t_test_local ( UPDATED_DATE DateTime, SCORE_RUN_ID String, ORGAN2 String, CHANNEL Nullable(String), RENEW_TYPE Nullable(String), PRICING_COUNT Decimal(3, 0), ACTUAL_PREMIUMN Nullable(Decimal(3, 0)), ) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/t_test_local/{shard}','{replica}',UPDATED_DATE) PARTITION BY tuple(ORGAN2) ORDER BY tuple(SCORE_RUN_ID) SETTINGS index_granularity = 8192; --释义 pricing: 指具体数据库用户名 Nullable:修饰列类型标识该列可能为空 ReplicatedReplacingMergeTree:多副本去重合并树表引擎,具体可参考其他表引擎,如ReplicatedMergeTree可以使用ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/t_test_local','{replica}') ORGAN2:用来做数据分区的列 SCORE_RUN_ID:主键索引列
2. 分布式表 - 用来应用对接查询使用,指向本地表,通常后缀带_all标识
CREATE TABLE IF NOT EXISTS t_test_all ON CLUSTER cluster_2_shard_2_replicas AS pricing.t_test_local ENGINE = Distributed('cluster_2_shard_2_replicas','pricing','t_test_local',rand())
--释义
cluster_2_shard_2_replicas:集群名称,建库时提前会创建好
可以借助数据同步工具同步,也可自行编写同步程序进行同步,可以采用Clickhouse JDBC进行PreparedStatement.addBatch()批量方式提交,不推荐使用Mybatis方式处理
<dependency> <groupId>com.clickhouse</groupId> <artifactId>clickhouse-jdbc</artifactId> <version>0.4.1</version> <classifier>http</classifier> </dependency>
可采用MyBatis或JDBC方式分析数据,基本与Oracle语法一致,一般分析结构:SELECT 列,SUM(指标) FROM 表名 WHERE ... GROUP BY 列
1)建议Clickhouse的分析维度列使用字符类型(String),指标列则使用数值类型(Decimal)
2)建议分区数量按总体表数量提前计算,每个分区可均匀分布1000万的数据量(假设一张表有1亿条,那么分区数为10个左右)
3)建议同步数据时批量提交的量为2000一组
4)存在空值或不确定的列请务必加上Nullable()将列类型包含进去,否则数据会写不进去,导致最终的数量对不上
5)上亿数据表统计查询耗时一般都在毫秒级别,如果达到秒级或更久需检查程序是否存在性能问题,可在数据库查询工具中对比(如dbeaver)
6)Clickhouse的数据压缩率常规表结构一般都在10%~20%之间,这也是其列式结构对于数据存储相比于OLTP数据库的优势