ClickHouse 入门与实战教程

news2024/9/27 9:25:52

目录

1. ClickHouse 简介

什么是 ClickHouse?

ClickHouse 的优势和特点

适用场景

2. 安装 ClickHouse

3. ClickHouse 的基本概念

4. ClickHouse 的基本操作

创建数据库和表、插入和查询数据

使用 MergeTree 引擎处理时序数据

管理分区

创建带有分区的 MergeTree 表

添加新分区

删除旧分区

查询现有分区

合并分区

5. ClickHouse 与 Spring Boot 集成

6. 注意事项和常见问题

注意事项

常见问题

结语


1. ClickHouse 简介

什么是 ClickHouse?

        ClickHouse 是一个用于实时数据分析的开源列式数据库,最初由俄罗斯的 Yandex 开发。它以高性能和卓越的可扩展性著称,专门用于高性能数据分析。它被设计用于大规模数据集的高速查询和分析,特别适用于 OLAP(联机分析处理)工作负载。

clickHouse官网:Fast Open-Source OLAP DBMS - ClickHouse

ClickHouse 的优势和特点

  • 列式存储:ClickHouse 采用列式存储,将数据按列存储在磁盘上,有助于压缩数据以及优化分析查询性能。

  • 高性能:ClickHouse 针对大数据量和高吞吐量进行了优化,能够在秒级内查询和分析数十亿行数据。

  • 分布式架构:支持水平扩展和集群部署,能够处理大规模数据,并提供高可用性。

  • 并行处理:能够同时利用多个 CPU 核心进行并行计算,提高查询处理速度。

  • 实时数据分析:ClickHouse 支持实时数据导入和实时查询,适用于需要快速分析实时数据的场景。

  • 灵活的查询语言:支持 SQL 查询语言,提供了丰富的查询功能,包括聚合、分组、排序等。

  • 可扩展性:可轻松集成到现有的数据处理管道中,支持多种数据格式。

        ClickHouse 被广泛应用于数据分析领域,特别适用于大数据量下的实时分析和报表生成等场景。其高性能和高度优化的列式存储特性使其成为处理大规模数据分析任务的理想选择。

适用场景

        ClickHouse 是一个针对大规模数据分析和时序数据处理优化的开源列式数据库管理系统。下面列举一些较为常用的场景:

  • 时序数据分析

    • ClickHouse 专注于时序数据,非常适用于处理时间序列数据,比如日志、传感器数据、监控数据等。
    • 能够高效处理需要按时间序列进行快速查询和分析的大规模数据。
  • 实时数据仓库(Real-time Data Warehouse)

    • ClickHouse 可以作为实时数据仓库,支持高并发、高吞吐量的查询,适用于快速响应实时数据的分析查询需求。
  • 分布式分析

    • 适用于大规模数据分析场景,支持分布式部署和高度扩展性,能够处理PB级别的数据规模。
  • 大规模数据分析和报表

    • 用于生成报表、数据可视化以及对海量数据进行查询和分析。
  • 日志和事件数据处理

    • 适用于处理大量日志和事件数据,支持对日志和事件数据进行快速的聚合、筛选和分析。
  • 高性能时序数据存储

    • ClickHouse 的列式存储、数据压缩和查询优化,使其在存储大量时序数据时表现出色。
  • 数据仓库存储

    • 作为数据仓库存储系统,适用于存储和分析大量结构化数据,支持复杂的数据查询。
  • 大数据分析平台

    • 在大数据分析平台中作为存储层,为大数据计算提供支持。

2. 安装 ClickHouse

        ubuntu 安装参考这篇【入门篇】ClickHouse 的安装与配置_clickhouse 安装-CSDN博客

        centos安装参考这篇:Linux(Centos7)下安装部署clickhouse(详细版)

3. ClickHouse 的基本概念

  • 表(Table)

    ClickHouse 中的表是数据存储的基本单元,使用列式存储。
  • 列族(Column Family)

    ClickHouse 的表可以按列族进行组织,相似类型的列可以组合在一起进行物理存储和压缩。
  • 分区(Partition)

    ClickHouse 支持根据分区键将数据分割成不同的分区,便于管理和查询。
  • 引擎(Storage Engine)

    ClickHouse 支持多种存储引擎,用于控制数据的存储方式和处理方法。
  • MergeTree

    ClickHouse 最常用的存储引擎之一,专门用于处理时序数据的引擎。
  • MergeTree 索引(Index)

    ClickHouse 使用 MergeTree 索引来加速查询操作。

4. ClickHouse 的基本操作

创建数据库和表、插入和查询数据

-- 创建数据库
CREATE DATABASE IF NOT EXISTS my_db;

-- 创建表
CREATE TABLE IF NOT EXISTS my_db.my_table
(
    event_date Date,
    event_time DateTime,
    user_id Int32,
    clicks Int32
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, event_time);

-- 插入数据
INSERT INTO my_db.my_table (event_date, event_time, user_id, clicks)
VALUES ('2023-12-31', '2023-12-31 23:59:59', 1, 10);

-- 查询数据
select * from my_db.my_table;

使用 MergeTree 引擎处理时序数据

        在 ClickHouse 中,MergeTree 引擎非常适合处理时序数据,例如日志、性能指标数据、时间序列数据等。它是 ClickHouse 提供的一种用于存储有序数据并快速执行范围查询的引擎。以下是使用 MergeTree 引擎处理时序数据的示例:

  • 创建带有 MergeTree 引擎的表

首先要创建一个带有 MergeTree 引擎的表。指定 ORDER BYPARTITION BY 子句。

CREATE TABLE IF NOT EXISTS tb_metric(
    timestamp DateTime,
    value Float64
) ENGINE = MergeTree()
ORDER BY (timestamp)
PARTITION BY toYYYYMM(timestamp);

        在这个示例中,创建了一个名为 tb_metric的表,包含 timestampvalue 两个字段。表使用 MergeTree() 引擎,按照 timestamp 字段进行排序,并按年份和月份进行分区

  • 插入时序数据

INSERT INTO your_table (timestamp, value)
VALUES ('2023-12-01 10:00:00', 25.5),
       ('2023-12-01 10:05:00', 26.2),
       ('2023-12-01 10:10:00', 24.8),
       ...
  • 查询时序数据

使用 MergeTree 引擎后,可以执行范围查询以获取特定时间范围内的数据。

SELECT *
FROM tb_metric
WHERE timestamp BETWEEN '2023-12-01 00:00:00' AND '2023-12-01 23:59:59';

该语句会检索tb_metric 表中 '2023-12-01' 这一天的所有数据,比如指标数据每分钟采集一次并进行存储,这个表的数据量会巨大,那么这个时候用此方式检索会比较快。

管理分区

在 ClickHouse 中,MergeTree 引擎支持对分区进行管理。分区管理可以根据时间范围、日期、月份等策略进行,以实现数据的有效存储和查询。以下是管理 MergeTree 表分区的基本操作:

创建带有分区的 MergeTree 表

和上面一样创建带有分区的 MergeTree 表,指定分区键和分区策略:

CREATE TABLE IF NOT EXISTS tb_metric(
    timestamp DateTime,
    value Float64
) ENGINE = MergeTree()
ORDER BY (timestamp)
PARTITION BY toYYYYMM(timestamp);

添加新分区

当数据到达新的时间范围时,需要为表添加新分区。ClickHouse 提供了 ALTER TABLE ... ATTACH PARTITION 语句来添加新分区:

ALTER TABLE your_table ATTACH PARTITION 202312;

删除旧分区

当不再需要某个时间段内的数据时,可以使用 ALTER TABLE ... DETACH PARTITION 语句删除旧分区:

ALTER TABLE your_table DETACH PARTITION 202301;

查询现有分区

要查看表中的所有分区,可以执行以下查询显示名为 tb_metric 的表的所有分区信息:

SELECT partition_id, partition
FROM system.parts
WHERE table = 'tb_metric';

合并分区

如果需要将两个分区合并为一个较大的分区以优化性能,可以使用 ALTER TABLE ... FREEZE PARTITION 来合并分区:

ALTER TABLE tb_metric FREEZE PARTITION 202310, 202311;

合理管理分区对于 ClickHouse 中处理大量时序数据是非常重要的,可以帮助优化查询性能和数据存储。

5. ClickHouse 与 Spring Boot 集成

ClickHouse JDBC 连接

<dependency>
    <groupId>ru.yandex.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>0.3.1</version> <!-- 替换为最新的 ClickHouse JDBC 版本 -->
</dependency>

配置数据源

spring.datasource.url=jdbc:clickhouse://your_clickhouse_host:port/default
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=ru.yandex.clickhouse.ClickHouseDriver

示例代码

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public class ClickHouseDAO {

    private final JdbcTemplate jdbcTemplate;

    public ClickHouseDAO(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public List<Object[]> executeQuery(String query) {
        return jdbcTemplate.query(query, (rs, rowNum) -> {
            // 处理结果集,返回数据
            // 例如:return new Object[] { rs.getString("column1"), rs.getInt("column2") };
        });
    }

    public int executeUpdate(String query) {
        return jdbcTemplate.update(query);
    }
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;

@RestController
public class ClickHouseController {

    private final ClickHouseDAO clickHouseDAO;

    public ClickHouseController(ClickHouseDAO clickHouseDAO) {
        this.clickHouseDAO = clickHouseDAO;
    }

    @GetMapping("/query")
    public List<Object[]> executeQuery() {
        String query = "SELECT * FROM your_table";
        return clickHouseDAO.executeQuery(query);
    }

    @GetMapping("/update")
    public int executeUpdate() {
        String query = "INSERT INTO your_table (column1, column2) VALUES ('value1', 123)";
        return clickHouseDAO.executeUpdate(query);
    }
}

或者使用mybatis的动态数据源

mysql的数据源配置:

# mysql 个性化配置, 不同的环境,需要配置不同的链接信息,只需要将这段信息复制到具体环境的配置文件中进行修改即可
spring:
  datasource:
    dynamic:
      #默认数据源
      primary: mysql
      #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      strict: false
      datasource:
        mysql:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://192.168.101.34:3306/refiner_dev?serverTimezone=CTT&characterEncoding=utf8&useUnicode=true&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&allowPublicKeyRetrieval=true
          username: root
          password: MySQL@123

ck的数据源配置:

spring:
  datasource:
    dynamic:
      datasource:
        clickhouse:
          driver-class-name: ru.yandex.clickhouse.ClickHouseDriver
          url: jdbc:clickhouse://192.168.101.35:8123/test
          username: default
          password: clickhouse

当需要使用clickhouse进行数据库表查询时,在service类或者mapper上指定@DS注解就可以用mybatis操作mysql一样使用ck了。

6. 注意事项和常见问题

        在使用 ClickHouse 时,以下是一些注意事项和可能遇到的常见问题:

注意事项

  • 数据模型设计: ClickHouse 适用于大规模数据分析和处理,设计数据模型时需考虑存储引擎、分区和数据类型,以最大程度地利用其性能。

  • 硬件和性能: ClickHouse 需要大量的内存和计算资源来执行查询,因此在部署时需要考虑硬件资源。

  • 数据复制和备份: 定期进行数据备份,并考虑数据的冗余备份,以防止数据丢失。

  • 数据导入和导出: 使用优化的方法将数据导入到 ClickHouse 中,并选择合适的格式进行数据导出。

  • 索引和优化: ClickHouse 使用不同的索引类型来优化查询,了解索引的使用方法可以提高查询性能。

  • 版本和更新: 定期更新 ClickHouse 到最新版本,以获得新的功能、性能改进和 bug 修复。

常见问题

  • 性能问题: 性能问题可能与查询的复杂性、硬件资源不足、数据模型设计不佳或查询优化有关。针对性能问题,需要对查询进行优化,增加硬件资源或重新设计数据模型。

  • 数据丢失: 当 ClickHouse 节点出现故障或网络问题时,可能会导致数据丢失。为了避免数据丢失,需要实施数据备份和冗余策略。

  • 连接问题: 网络故障或配置错误可能导致 ClickHouse 无法连接或无法访问。检查网络配置、防火墙设置以及连接字符串是否正确。

  • 内存问题: ClickHouse 在处理大量数据时可能会出现内存问题。通过配置适当的内存参数和优化查询来解决内存问题。

  • 版本兼容性: 当迁移到新版本的 ClickHouse 时,可能会遇到与之前版本不兼容的问题。在升级之前,查阅官方文档以了解可能的不兼容性变化。

  • 异常处理: ClickHouse 查询中可能会出现各种异常,如语法错误、连接超时等。编写健壮的代码来处理这些异常情况,确保应用程序的稳定性和可靠性。

结语

        clickHouse 是一个强大的列式分布式数据库管理系统,具有出色的性能、高效的列存储、适应大规模数据处理等特点。它在数据分析、时序数据处理和大规模数据查询方面表现优异。通过其优异的压缩算法和并行查询能力,ClickHouse 能够快速处理大规模数据,并支持复杂的查询和分析操作。其分布式架构使其能够轻松扩展以适应不同规模和需求的数据。

        在使用 ClickHouse 时,需要考虑数据模型设计、分区策略、数据导入和查询优化等方面。针对特定的业务场景,可以选择合适的存储引擎和优化策略,以实现更高效的数据处理和查询操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1334386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IP编址,IP地址介绍与子网划分方法

网络层位于数据链路层与传输层之间。网络层中包含了许多协议&#xff0c;其中最为重要的协议就是IP协议。网络层提供了IP路由功能。理解IP路由除了要熟悉IP协议的工作机制之外&#xff0c;还必须理解IP编址以及如何合理地使用IP地址来设计网络。 上层协议类型 以太网帧中的Typ…

【浏览器】同源策略和跨域

1. 什么是跨域 在说跨域之前,先说说同源策略,什么是同源策略呢?同源策略是浏览器的一种安全机制,减少跨站点脚本攻击(XSS,Cross Site Scripting)、跨站点请求伪造(CSRF,Cross Site Request Forgery)攻击等,因为非同源的请求会被浏览器拦截掉。 同源就是协议、域名(…

常用组件的一些数据指标

QPS metrics 机制&#xff0c;利用 AtomicLong 算出核心接口每分钟调用多少次&#xff08;除以 60 就是高峰期每秒访问次数&#xff09;以及每天被调用总次数 TP99 100ms , 99%的接口耗时在 100ms以内&#xff0c;1%的接口耗时在100ms以上 TP95 100ms , 95%的接口耗时在 1…

Python:最新Windows及Mac开发环境搭建(最详细版,附安装包)

windows 软件下载 从官网下载python和pycharm。大家建议使用同一个版本 下面是下载地址&#xff0c;也可直接到我网盘下载安装包&#xff08;在文章末尾哦&#xff09; ● python https://www.python.org/ ● pycharm https://www.jetbrains.com/zh-cn/pycharm/download/#sect…

计算机毕业设计----SSM实现的一个在线文具学习用品购买商城

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员信息管理,查看用户信息,新闻公告信息管理,文具类型信息管理,城市信息管理,配货点信息管理,文具信息管理,订单信息…

速看!销冠高效给客户群发消息的秘诀

你是不是也有过这样的疑问&#xff1a;明明都是给客户群发消息&#xff0c;为什么别人的成交率那么高&#xff0c;自己却效果一般呢&#xff1f; 今天就给大家分享销冠常用的高效群发消息秘诀&#xff0c;让大家都能更好地与客户进行沟通&#xff0c;提高成交率&#xff01; …

一盒晶圆只有25片吗?

没有答案&#xff0c;可能是实践的标准。后来在工作过程中发现还有13片的&#xff0c;个人认为研究这个问题不如多看看foup&#xff01; 晶圆载具用于硅片生产、晶圆制造以及工厂之间晶圆的储存、传送、运输以及防护。晶圆载具种类很多&#xff0c;如FOUP用于晶圆制造工厂中晶圆…

金和OA C6 gethomeinfo sql注入漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞概述 金和 OA C6 gethomeinfo接口处存在SQL注入漏洞&#xff0c;攻击者除了可以利用 SQL 注入漏洞获取…

cuda加速求解龙格库塔四阶五步积分

一般代码使用cuda加速的方法&#xff1a; 使用PyTorch进行加速&#xff1a; 首先&#xff0c;你需要将你的ODE系统定义为PyTorch模型&#xff0c;这样可以利用PyTorch的自动微分功能和GPU加速。然后&#xff0c;你需要将数据和参数转换为PyTorch张量&#xff0c;并将它们移动到…

基于ssm高校宿舍管理系统论文

基于vue的高校宿舍管理系统的设计与实现 摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前学校对于宿舍信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这…

IntelliJ IDEA Community(社区版)下载及安装自用版

IntelliJ IDEA Community&#xff08;社区版&#xff09;下载及安装自用版 估计是个开发都逃脱不了用IDEA的命运吧&#xff0c;这么好的软件&#xff0c;白嫖了好多年。感恩。 现在很多公司已经不让用商业版的破解版了&#xff0c;所以这里讲的是社区版。 区别&#xff1a; 商…

在线客服系统的优势:提升客户服务质量与效率的关键工具

一款好的客服系统能够帮助企业节约成本、提高服务效率、消除服务延迟 、加强客户忠诚&#xff0c;为企业的售后服务带来显著的提升&#xff0c;对企业来讲意义非凡。 就像Zoho Desk&#xff0c;它系统稳定性好、安全性高、用户体验效果好、性价比高&#xff0c;同时售后服务好&…

【HarmonyOS开发】ArkTs实现应用配色随系统深浅模式自动切换的三种方式

应用深浅配色模式是一种常见的系统外观选项&#xff0c;环境变暗时切换到深色模式&#xff0c;可以减轻眼睛疲劳和节省设备电量。 注意&#xff1a;DevEco Studio 4.0版本存在bug&#xff0c;无法生效。 1、实现思路 利用系统颜色资源&#xff1a;这种方法最简单&#xff0c;只…

树莓派安装mediapipe方法

MediaPipe 解决方案可跨多个平台使用。 每个解决方案都包含一个或多个模型&#xff0c;您也可以为某些解决方案自定义模型。 以下列表显示了每个受支持平台可用的解决方案以及您是否可以使用 Model Maker 来自定义模型&#xff1a; 在树莓派上安装mediapipe后, python可以支持…

顺序表的实现(头插、尾插、头删、尾删、查找、删除、插入)

目录 一. 数据结构相关概念​ 二、线性表 三、顺序表概念及结构 3.1顺序表一般可以分为&#xff1a; 3.2 接口实现&#xff1a; 四、基本操作实现 4.1顺序表初始化 4.2检查空间&#xff0c;如果满了&#xff0c;进行增容​编辑 4.3顺序表打印 4.4顺序表销毁 4.5顺…

Linux进阶系列(二)——lscpu、htop、seq、shuf、sort

1. lscpu lscpu 命令是Linux系统中用来显示关于CPU架构的信息的工具。它详细展示了CPU的相关信息&#xff0c;包括型号、核心数、架构类型、缓存大小等等。 1.1 物理CPU与逻辑CPU 物理CPU指的是实际存在于硬件系统上的中央处理单元。每个物理CPU都是一个独立的处理器芯片或处…

系列十一(实战)、发送 接收带标签的消息(Java操作RocketMQ)

一、发送 & 接收带标签的消息 1.1、概述 消息的种类纷繁复杂&#xff0c;不同的业务场景需要不同的消息&#xff0c;基于此RocketMQ提供了消息过滤功能&#xff0c;通过Tag或者Key进行区分&#xff0c;本章介绍Tag&#xff0c;我们再往一个Topic里面发送消息的时候&#x…

MySQL定时备份实现

一、备份数据库 –all-databases 备份所有数据库 /opt/mysqlcopy/all_$(date “%Y-%m-%d %H:%M:%S”).sql 备份地址 docker exec -it 容器名称 sh -c "mysqldump -u root -ppassword --all-databases > /opt/mysqlcopy/all_$(date "%Y-%m-%d %H:%M:%S").sq…

SSRF中Redis的利用

目录 1. SSRF 1.1 什么是SSRF 1.2 漏洞成因 1.3 可能会存在SSRF的地方 1.4 SSRF分类 1.5 验证方法 1.6 利用方式 1.7 可以利用的协议 1.8 SSRF过滤绕过 2. SSRF攻击Redis 2.1 环境搭建 2.2 漏洞复现(通过ssrf利用redis写入webshell) 2.2.1 想要写入webshell的两个…

ECMAScript 的未来:预测 JavaScript 创新的下一个浪潮

以下是简单概括关于JavaScript知识点以及一些目前比较流行的比如&#xff1a;es6 想要系统学习&#xff1a; 大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&…