ClickHouse 入门与实战教程

目录

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: falsedatasource:mysql:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.101.34:3306/refiner_dev?serverTimezone=CTT&characterEncoding=utf8&useUnicode=true&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&allowPublicKeyRetrieval=trueusername: rootpassword: MySQL@123

ck的数据源配置:

spring:datasource:dynamic:datasource:clickhouse:driver-class-name: ru.yandex.clickhouse.ClickHouseDriverurl: jdbc:clickhouse://192.168.101.35:8123/testusername: defaultpassword: 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.mzph.cn/news/559429.shtml

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

相关文章

sid图像数据_实战材料信息学:使用skimage处理扫描电子显微镜(SEM)图像数据

算开个头&#xff0c;不算特别实战扫描电子显微镜&#xff0c;材料开发不可缺少的分析仪器。原理就不详述了。材料的形貌&#xff0c;具体长什么样的都可以看得很清楚。材料表面的形貌很多情况下会和材料的物性产生直接关系&#xff0c;比如说可以从SEM看出粒子的直径分布&…

arcgis制作空间变化图怎么做_听说如果做数据分析不用GIS,会被开?

Q你有没有遇到这样的情况&#xff1f;身边的同事或同学经常说什么高程图、坡向图、坡度图、生态水文图、热力密度图、大数据算法&#xff0c;而自己却一无所知&#xff0c;心里感到特别的慌啊。文末附ArcGIS最新版及超强数据神器 很多人会说&#xff0c;“设计师是感性的&#…

仅完成部分的readprocessmemory或write_王者荣耀:三种李小龙获取方式!无需完成任务、28号即可兑换...

哈喽大家好&#xff01;我是你们的小菜鸡“荣耀急先锋”王者荣耀五周年庆限定皮肤李小龙活动已经开始啦&#xff01;大家有参加了吗&#xff1f;或者说对这个活动不太理解&#xff0c;针对这些小伙伴菜鸡今天就简单的跟大家讲讲李小龙皮肤活动的规则&#xff0c;让我们一起看看…

优秀ppt作品范例_首次公开|锐普的内部PPT配色库

每次发锐普的作品&#xff0c;总会有小伙伴们问&#xff1a;这么漂亮的配色到底是怎么做的呢&#xff1f;今天我在锐普内部的资源库发现一个超级宝贝——锐普内部的PPT配色库&#xff0c;1008张超精彩PPT配色范例。我的天&#xff0c;原来设计部竟然还藏着这种宝贝&#xff01;…

linux rz sz 安装_Windows与Linux文件传输之lrzsz工具

请关注本头条号&#xff0c;每天坚持更新原创干货技术文章如需学习视频&#xff0c;请查看本头条号简介&#xff0c;免费在线观看学习视频1. lrzsz工具简介Windows向Linux传输文件&#xff0c;最简单的方法是使用rz和sz命令。当然用有其他的方法&#xff0c;比如通过ssh(winscp…

java游戏重新开始_问题1:java问题--某局小游戏结束后怎么重新开始?

有个问题&#xff0c;想了好久没解决&#xff0c;上网找了下&#xff0c;貌似也没找到好的解决方法(谷歌暂时没上去)&#xff0c;现在这里写下来吧&#xff1a;最近在写一个五子棋的小游戏&#xff0c;也算是刚刚开始java入门的一个作品了吧&#xff0c;刚刚完成到人人对战(当然…

lua pcall 返回值_Redis和Lua整合

前面我们已经介绍完了Redis相关的理论知识&#xff0c;从本篇开始我们介绍一些Redis相关的时机应用。比如&#xff1a;Redis整合LuaRedis的消息模式Redis实现分布式锁常见的缓存问题我们先从Redis整合Lua的使用开始。lua是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并…

java 异步调用webapi_Async Await异步调用WebApi

先铺垫一些基础知识 在 .net 4.5中出现了 Async Await关键字&#xff0c;配合之前版本的Task 来使得开发异步程序更为简单易控。 在使用它们之前 我们先关心下 为什么要使用它们。好比 一个人做几件事&#xff0c;那他得一件一件的做完&#xff0c;而如果添加几个人手一起帮着…

百度相关搜索软件_不太热门的办公神器软件篇搜索相关

这次介绍两个windows平台超好用的搜索神器——listary和everything全文阅读约需3分钟在工作中&#xff0c;虽然大部分文件都会分门别类地放在对应的文件夹中&#xff0c;但总有一些放完就忘了在哪或是层级过深打开不便的情况。这两个搜索神器完美地解决了找不到文件且windows自…

mysql 回滚段_MySQL和PostgreSQL比较

1、MySQL相对来说比较年轻&#xff0c;首度出现在1994年。它声称自己是最流行的开源数据库。MySQL就是LAMP(用于Web开发的软件包&#xff0c;包括 Linux、Apache及Perl/PHP/Python)中的M。构建在LAMP栈之上的大多数应用都会使用MySQL&#xff0c;包括那些知名的应用&#xff0c…

dbscan java_DBSCAN算法的Java,C++,Python实现

最近由于要实现‘基于网格的DBSCAN算法’&#xff0c;网上有没有找到现成的代码[如果您有代码&#xff0c;麻烦联系我]&#xff0c;只好参考已有的DBSCAN算法的实现。先从网上随便找了几篇放这儿&#xff0c;之后对比研究。DBSCAN简介&#xff1a;1.简介DBSCAN 算法是一种基于密…

java volatile lock_Java并发学习笔记 -- Java中的Lock、volatile、同步关键字

Java并发一、锁1. 偏向锁1. 思想背景来源&#xff1a;HotSpot的作者经过研究发现&#xff0c;大多数情况下&#xff0c;锁不仅不存在多线程竞争&#xff0c;而且总是由同 一线程多次获得&#xff0c;为了让线程获得锁的代价更低而引入了偏向锁。原理&#xff1a;在对象头和栈帧…

python 数组赋值_pythonamp;numpy的赋值

有点编程基础的童鞋看到这个标题可能会有点懵逼&#xff0c;这还是个问题吗&#xff1f;不就是个等号()解决问题嘛&#xff01;我也希望是如此简单&#xff0c;因为上个星期被这个问题折磨到崩溃&#xff01;一般的python程序需要赋值时的确是通过等号()实现的&#xff0c;不管…

我的世界java 内存_我的世界如何分配内存

如果你在运行Minecraft时出现内存错误等问题&#xff0c;你可能需要给Minecraft分配更多内存来解决运行故障。如果你玩的是新版本的Minecraft&#xff0c;那么你可以从启动器里直接分配内存(RAM)。如果你使用的是旧版本&#xff0c;那么你需要创建一些文件来改变Minecraft内存使…

springbean的生命周期_spring bean生命周期(涵盖spring常用接口的载入)

spring bean生命周期流程图&#xff1a;​​​​其中包含了很多常用的接口&#xff0c;可以参考spring 常用接口&#xff1b;下面写个例子证明下&#xff1a;1.实现InitializingBean以及各个Aware接口public class UserB implements InitializingBean , BeanFactoryAware , Bea…

python中的索引从几开始计数_计算机为什么要从 0 开始计数?

作者&#xff1a;程序喵大人来源&#xff1a;程序喵大人大家好&#xff0c;我是猫哥&#xff01;众所周知&#xff0c;计算机是从0开始计数&#xff0c;而不是我们平时常用的从1开始计数&#xff0c;但你有想过为什么吗&#xff1f;其实不是计算机从0开始计数而是多数编程语言中…

coreos 安装mysql_如何执行CoreOS Linux的裸机安装

本文将介绍如何在裸机服务器上加载CoreOs Linux。关于在计算机上安装CoreOS Linux的更多方法。在本文中&#xff0c;我们将首先启动一些Live Linux发行版。从USB或CDROM提取Fedora&#xff0c;然后使用CoreOS的安装脚本在给定的硬盘驱动器上执行实际的CoreOS Linux。您将需要什…

websocket 发送图片_基于WebSocket的web端IM即时通讯应用的开发

基于WebSocket的web端IM即时通讯应用的开发功能列表&#xff1a;1、Web端的IM即时通讯应用2、支持上线、下线、实时在线提醒3、单聊、群聊的建立4、普通文字、表情、图片的传输(子定义富文本)5、单人的顶级提醒&#xff0c;多对话的窗口的提醒6、调用图灵机器人的自动回复演示目…

PHP定时抽奖怎么实现的,PHP 实现抽奖逻辑

public static function get_rand($proArr) {$result "";//概率数组的总概率精度$proSum array_sum($proArr);//概率数组循环foreach ($proArr as $key > $proCur) {$randNum mt_rand(1, $proSum);if ($randNum < $proCur) {$result $key;break;} else {$p…

绿盟漏洞扫描_主机安全漏洞解决方案

前几天发了一篇等保2.0的文章(等保2.0简单介绍 )&#xff0c;文章里面提到&#xff0c;相比于等保1.0标准&#xff0c;等保2.0很大幅度上对安全通用要求的一些控制项做了大幅精简&#xff0c;但是等保二级的要求仍多达135项、等保三级多达211项。https://mp.weixin.qq.com/s/kE…