文章目录
外部存储引擎分类
引擎类型 | 描述 | 特点 |
---|---|---|
MySQL | 从 MySQL 数据库中读取数据 | 用于与 MySQL 数据库共享数据,支持读取 MySQL 表中的数据 支持 SQL 语法,适合进行联合查询 |
PostgreSQL | 从 PostgreSQL 数据库中读取数据 | 用于与 PostgreSQL 数据库共享数据,支持读取 PostgreSQL 表中的数据 支持 SQL 语法,适合进行联合查询 |
MongoDB | 从 MongoDB 数据库中读取数据 | 用于与MongoDB数据库共享数据,支持读取MongoDB表中的数据 支持 SQL 语法,适合进行联合查询 |
JDBC | 通过 JDBC 接口连接到外部数据库(如Oracle、MySQL、PostgreSQL等) | 允许通过 JDBC 连接多种数据库 适合与各种关系型数据库系统集成 |
ODBC | 通过 ODBC 接口连接到外部数据库(如Oracle、MySQL、PostgreSQL等) | 允许通过 ODBC 连接多种数据库 适合与各种关系型数据库系统集成 |
Kafka | 从Apache Kafka 消息队列系统读取实时流数据 | 用于实时数据流分析,支持高吞吐量 适合处理大规模、实时的消息流数据 |
RabbitMQ | 从RabbitMQ 消息队列系统读取数据 | 支持从 RabbitMQ 队列中实时读取消息数据 用于流式数据处理和消息队列集成 |
File | 从本地或远程文件系统读取数据 | 适用于读取 或写入文件数据,如 CSV、TSV、JSON 等格式 |
URL | 通过 URL 从外部 Web 资源获取数据 | 支持通过 HTTP 或 HTTPS 协议从指定 URL 获取数据,适用于从外部网页、API 或文件中读取数据 支持不同的格式(如 JSON、XML、HTML 等),可以通过 GET 或 POST 请求获取数据,适合与外部 Web 服务、RESTful API 集成 |
HDFS | 从 Hadoop 分布式文件系统(HDFS)读取数据 | 用于大数据存储和处理,适合与 Hadoop 生态系统集成。 支持读取大规模文件(如 Parquet、ORC、Avro) |
MySQL引擎
MySQL 引擎允许从 MySQL 数据库中读取数据。它提供了一种与 MySQL 数据库进行集成的方式,尤其在需要从 MySQL 中实时获取数据时非常有用。该引擎通过在 ClickHouse 中创建外部表来实现与 MySQL 数据库的交互。
使用场景:
- 与现有 MySQL 系统集成:如果你已经在使用 MySQL 作为业务数据库,可以通过 ClickHouse 的 MySQL 引擎来进行高效的数据分析,而不必将数据迁移到 ClickHouse。
- 跨平台数据共享:适用于跨平台或跨数据库系统的数据共享,例如在 MySQL 和 ClickHouse 之间同步数据,进行联合查询分析。
- 报表与实时分析:MySQL 数据库可能用于存储事务数据,而 ClickHouse 可以对这些数据进行实时分析,生成报表或进行 OLAP 查询。
支持功能:
- 读取数据:通过 MySQL 引擎,ClickHouse 可以从 MySQL 数据库中读取数据进行分析。
- 简单的查询操作:支持常规的 SQL 查询语法,如 SELECT, WHERE, JOIN 等。
- 实时数据访问:ClickHouse 与 MySQL 的连接是实时的,查询会直接访问 MySQL 数据库中的数据,而不是通过静态导入。
- 不支持写入:通过 MySQL 引擎创建的表仅支持从 MySQL 读取数据,无法向 MySQL 表中写入数据。如果需要写入操作,可以使用其他工具或方法进行数据迁移。
注意事项:
- 延迟和吞吐量:由于 ClickHouse 是面向 OLAP(联机分析处理)设计的,而 MySQL 更适合 OLTP(联机事务处理)场景,使用 MySQL 引擎读取数据时可能会受到 MySQL 性能的限制,尤其是当查询涉及大量数据时。
- 网络延迟:如果 MySQL 数据库与 ClickHouse 部署在不同的网络环境中,网络延迟可能会影响查询性能。
基本语法:
sql
CREATE TABLE mysql_table
(
column1 DataType, -- 列名需要与mysql的列名保持一致
column2 DataType,
...
)
ENGINE = MySQL('mysql_host:port', 'database_name', 'table_name', 'user', 'password')
使用示例:
sql
create table test_MySQL
(
id Int64,
name String,
log Decimal(10, 6),
lat Decimal(10, 6),
crt_time DateTime
)
engine = MySQL('127.0.0.1:3306', 'xxok', 'region_log_lat', 'root', '111111');
PostgreSQL引擎
PostgreSQL 引擎允许 ClickHouse 直接读取 PostgreSQL 数据库中的数据。通过这个引擎,可以在 ClickHouse 中使用类似 SQL 查询的方式访问 PostgreSQL 中存储的数据,尤其适用于需要从 PostgreSQL 数据库中获取数据并进行 OLAP(联机分析处理)操作的场景。
使用场景:
- 与现有 PostgreSQL 系统集成:如果你的系统已经在使用 PostgreSQL 作为主要数据库,可以利用 ClickHouse 的 PostgreSQL 引擎进行大规模的分析,而无需迁移数据。
- 跨系统数据共享:适用于在 ClickHouse 和 PostgreSQL 之间进行数据共享和联合查询。例如,你可以在 ClickHouse 中创建外部表,查询 PostgreSQL 数据库中的数据,同时利用 ClickHouse 的 OLAP 特性进行高效分析。
- 报表与实时分析:PostgreSQL 通常用于存储事务性数据,而 ClickHouse 适合进行高效的实时数据分析。可以利用 ClickHouse 进行报表生成、数据分析等任务。
支持功能:
- 读取数据:通过 PostgreSQL 引擎,ClickHouse 可以从 PostgreSQL 数据库中读取数据进行分析。
- 常规查询:支持标准 SQL 查询语法,包括 SELECT、WHERE、JOIN 等。
- 实时数据访问:ClickHouse 与 PostgreSQL 的连接是实时的,查询会直接访问 PostgreSQL 数据库中的最新数据。
- 不支持写入:通过 PostgreSQL 引擎创建的表只能用于读取数据,无法向 PostgreSQL 表中写入数据。如果需要写入操作,可以使用其他工具进行数据迁移或同步。
注意事项:
- 延迟和吞吐量:ClickHouse 是为 OLAP 场景优化的,而 PostgreSQL 更适合 OLTP(联机事务处理)场景。因此,使用 PostgreSQL 引擎- 时可能会受到 PostgreSQL 数据库性能的限制,尤其是在查询大数据量时。
- 网络延迟:如果 ClickHouse 和 PostgreSQL 部署在不同的网络环境中,网络延迟可能会影响查询性能,尤其是在大数据量查询时。
- 数据同步问题:由于查询数据是通过实时连接获取的,可能会受到 PostgreSQL 负载的影响,导致查询延迟。
基本语法:
sql
CREATE TABLE mysql_table
(
column1 DataType, -- 列名需要与PostgreSQL的列名保持一致
column2 DataType,
...
)
ENGINE = PostgreSQL('PostgreSQL_host:port', 'database_name', 'table_name', 'user', 'password')
使用示例:
sql
create table test_PostgreSQL
(
id Int64,
name String,
log Decimal(10, 6),
lat Decimal(10, 6),
crt_time DateTime
)
engine = PostgreSQL('127.0.0.1:5432', 'npm', 'region_log_lat', 'postgres', '111111');
MongoDB引擎
MongoDB 引擎(Mongo 引擎)允许用户直接从 MongoDB 数据库读取数据,并将其作为外部数据源在 ClickHouse 中执行查询和分析。MongoDB 是一个文档数据库,通常用于存储半结构化的 JSON 数据,而 ClickHouse 是一个列式数据库,擅长大规模的数据分析任务。通过 MongoDB 引擎,ClickHouse 可以高效地从 MongoDB 中读取数据,并结合 ClickHouse 的 OLAP(联机分析处理)能力进行快速查询和分析。
使用场景:
- 与现有 MongoDB 系统集成: 如果你的系统已经使用 MongoDB 存储数据,可以利用 ClickHouse 的 MongoDB 引擎直接查询 MongoDB 数据库中的数据,进行高效的分析,而无需将数据迁移到 ClickHouse。
- 跨系统数据共享: MongoDB 和 ClickHouse 是不同类型的数据库,它们各自有独特的优势。使用 MongoDB 引擎,可以方便地在两者之间共享数据,例如,在 ClickHouse 中创建外部表,通过 SQL 查询 MongoDB 中的数据,同时利用 ClickHouse 的列式存储和聚合性能来提高查询效率。
- 实时数据分析: MongoDB 通常存储业务应用的实时数据,而 ClickHouse 擅长 OLAP 查询。通过 MongoDB 引擎,可以在 ClickHouse 中对 MongoDB 中存储的实时数据进行快速查询和分析,支持业务报表和实时分析。
支持功能:
- 读取数据: MongoDB 引擎允许 ClickHouse 直接读取 MongoDB 中的数据,可以执行 SQL 查询语句从 MongoDB 中提取数据进行分析。
- 常规查询: 支持标准 SQL 查询,包括 SELECT、WHERE、JOIN、GROUP BY 等常用操作,允许用户对 MongoDB 中的数据进行灵活分析。
- 实时数据访问: ClickHouse 会实时连接到 MongoDB 数据库进行查询,确保查询到的数据是最新的。
- 不支持写入: 目前,MongoDB 引擎仅支持从 MongoDB 中读取数据,不能向 MongoDB 表中写入数据。如果需要将数据写入 MongoDB,可以使用其他工具进行数据迁移或同步。
注意事项:
- 查询延迟和吞吐量: 由于 ClickHouse 是为 OLAP 场景优化的,而 MongoDB 更适合存储非结构化的、频繁更新的文档数据,使用 MongoDB 引擎时可能会面临查询性能上的限制,尤其是在数据量较大时。
- 网络延迟: 如果 ClickHouse 和 MongoDB 部署在不同的网络环境中,网络延迟可能会影响查询性能,尤其是在大数据量查询时。
- MongoDB 数据模型: MongoDB 使用文档模型存储数据,数据通常是嵌套的或包含数组类型,这要求用户在创建 ClickHouse 表时根据 MongoDB 数据结构进行适配,尤其是在处理嵌套文档或数组时。
- 数据同步问题: 由于 MongoDB 引擎是实时连接到 MongoDB 的,这意味着如果 MongoDB 负载较高或存在写入操作,可能会影响 ClickHouse 查询的响应速度。
基本语法:
sql
CREATE TABLE mongo_table
(
column1 DataType, -- 列名需要与 MongoDB 的列名保持一致
column2 DataType,
...
)
ENGINE = Mongo('mongodb_host:port', 'database_name', 'collection_name', 'user', 'password')
- mongodb_host:port:MongoDB 实例的主机地址和端口。
- database_name:MongoDB 数据库名称。
- collection_name:MongoDB 中的集合名称(类似关系型数据库中的表)。
- user:MongoDB 的用户名(如需要认证)。
- password:MongoDB 的密码(如需要认证)。
使用示例:
sql
create table test_MongoDB
(
id Int64,
name String,
log Decimal(10, 6),
lat Decimal(10, 6),
crt_time DateTime
)
engine = MongoDB('127.0.0.1:27017', 'user', 'region_log_lat', 'admin', 'abc11111');
JDBC引擎
JDBC 引擎 允许通过 Java Database Connectivity (JDBC) 连接到外部的关系型数据库(如 MySQL、PostgreSQL、Oracle、SQL Server 等)。通过这个引擎,ClickHouse 可以访问和查询其他数据库中的数据。JDBC 引擎是为了解决跨数据库查询和数据集成问题,使得 ClickHouse 用户能够在不将数据迁移到 ClickHouse 本地的情况下,直接查询外部数据库中的数据。
需要注意: JDBC 引擎依赖外部程序clickhouse-jdbc-bridge ,clickhouse-jdbc-bridge 是用于在 ClickHouse 和外部数据库(如 MySQL)之间进行数据交互的桥接服务,如果该服务没有启动,你将无法使用 JDBC 引擎连接到 MySQL 数据库。
使用场景:
- 跨数据库查询:在多数据源环境中,ClickHouse 可以通过 JDBC 引擎读取不同数据库(如 MySQL、Oracle 等)中的数据,进行联合查询和分析。适合需要跨多个系统汇总数据的场景。
- 与现有关系型数据库集成:如果你的业务已经依赖某些传统的关系型数据库(如 MySQL、PostgreSQL 等),但又需要使用 ClickHouse 进行大规模的数据分析,JDBC 引擎可以帮助你在不迁移数据的情况下,利用 ClickHouse 的 OLAP 特性进行高效分析。
- 报表与实时分析:对于需要生成实时报表或进行即时数据分析的场景,JDBC 引擎提供了一种无缝集成的方式,可以直接从关系型数据库中读取数据并进行分析。
支持功能:
- 读取数据:JDBC 引擎允许 ClickHouse 从其他关系型数据库读取数据,进行 OLAP 查询。
- 支持常规 SQL 查询:ClickHouse 通过 JDBC 引擎支持标准的 SQL 查询语法,包括 SELECT、WHERE、JOIN、GROUP BY 等操作,可以对外部数据库的数据进行查询、过滤和聚合。
- 实时数据访问:ClickHouse 与外部数据库的连接是实时的,查询结果会直接从外部数据库中获取最新的数据。
- 不支持写入:与 PostgreSQL 引擎类似,JDBC 引擎只能用于读取数据,不能直接向外部数据库中写入数据。如果需要数据写入,可能需要借助其他工具进行数据同步或迁移。
注意事项:
- 网络延迟:由于 JDBC 引擎是通过网络访问外部数据库,网络延迟可能会影响查询性能,尤其是在数据量大或跨地域部署的情况下。
- 外部数据库性能:ClickHouse 是为 OLAP 场景优化的,而许多传统关系型数据库(如 MySQL、PostgreSQL)主要优化 OLTP 场景。因此,在高并发、大数据量的情况下,外部数据库的性能瓶颈可能会影响查询速度。
- 数据传输和吞吐量:JDBC 查询通常需要跨网络传输数据,可能会受到带宽和网络条件的限制,从而影响查询性能。
连接池管理:为了提高 JDBC 查询的效率,通常需要在 ClickHouse 配置适当的连接池管理,避免每次查询都重新建立连接。
基本语法:
sql
CREATE TABLE external_table_name
(
column1 DataType,-- 列名需要与支持jdbc的数据库表的列名保持一致
column2 DataType,
...
)
ENGINE = JDBC('uri', 'external_database', 'external_table')
- uri:外部数据库的的URI
URI格式::jdbc:<driver_name>://<host_name>:/?user=&password=
MySQL示例:jdbc:mysql://localhost:3306/?user=root&password=root - external_database:外部数据库的数据库名
- external_table:外部表名或类似select * from table1 where column1=1的查询语句
使用示例:
sql
create table test_JDBC_MySQL
(
id Int64,
name String,
log Decimal(10, 6),
lat Decimal(10, 6),
crt_time DateTime
)
engine = JDBC('jdbc:mysql://127.0.0.1:3306/?user=root&password=abc111111', 'xxok', 'region_log_lat');
ODBC引擎
ODBC 引擎使得 ClickHouse 能够通过 ODBC 协议与外部数据库建立连接,从而进行数据查询和集成。主要的区别在于,ODBC 和 JDBC 提供的是不同的数据库连接标准,ODBC 通常用于与 Windows 环境中的传统数据库系统(如 SQL Server、Oracle、MySQL 等)连接,而 JDBC 则是 Java 专用的。
Kafka引擎
Kafka 引擎 允许 ClickHouse 从 Apache Kafka 中实时消费消息流,并将这些消息存储到 ClickHouse 数据表中。Kafka 是一个分布式流处理平台,广泛应用于实时数据处理和消息传递系统。通过 Kafka 引擎,ClickHouse 能够直接从 Kafka 消费数据流,并实时进行数据分析和查询。
Kafka 引擎提供了一个高效且灵活的方式,用于将 Kafka 中的数据实时加载到 ClickHouse 中进行 OLAP(在线分析处理)查询。适用于需要实时流数据分析的场景,如日志分析、实时监控、金融数据分析等。
使用场景:
- 实时数据流分析:Kafka 引擎使 ClickHouse 能够实时从 Kafka 中读取数据流进行分析。例如,实时处理传感器数据、点击流数据、日志数据等。
- 事件驱动架构:在事件驱动架构中,Kafka 扮演消息队列的角色,ClickHouse 通过 Kafka 引擎消费事件流并进行实时处理,适用于金融、广告、日志等业务领域。
- 日志聚合和监控:将来自不同服务的日志流通过 Kafka 发送到 ClickHouse,进行日志分析和监控。
支持功能:
- 实时消费:ClickHouse 可以实时从 Kafka 消费数据,适用于需要低延迟处理的应用场景。
- 数据批量写入:Kafka 引擎支持批量消费数据,并定期将数据写入 ClickHouse 表中。
- 支持多主题:Kafka 引擎支持从多个 Kafka 主题消费数据,并将其整合到 ClickHouse 中。
注意事项:
-
Kafka 引擎表的数据流动方式:
Kafka消费表不能直接作为结果表使用,Kafka消费表只是用来消费Kafka数据,没有真正的存储所有数据。Kafka 引擎表并不像普通的表一样直接存储数据。它仅仅是一个流处理的接口,专门用于从 Kafka 消费数据。这个表本质上是一个 虚拟表,它没有传统意义上的磁盘存储,而是通过实时读取 Kafka 消息流的数据进行操作。因此,你不能直接对 Kafka 引擎表进行查询操作来获取数据,尤其是如果 Kafka 表没有物化视图或者目标表来接收数据时,表本身不会存储数据。
-
数据不持久化:
Kafka 引擎表会将 Kafka 消费的数据暂时存储在内存中或某种临时的缓存结构中,并没有持久化存储在磁盘上。这使得在查询 Kafka 引擎表时,无法直接查询到你期待的结果,尤其是当数据还没有完全从 Kafka 流入到其他表时,查询可能会没有返回数据。
-
延迟与批量消费:
Kafka 引擎表通常是按 批量消费 或者定时从 Kafka 中读取数据的,而不是实时地将每一条消息立即写入 ClickHouse 表。如果没有物化视图的帮助,Kafka 中的数据可能不会被实时写入其他表中,或者它们可能只会在某些条件下(如批量写入或时间窗口)才会被消费和同步。
基本语法:
Kafka引擎表:
sql
CREATE TABLE external_table_name
(
column1 DataType,
column2 DataType,
...
)
ENGINE = Kafka('kafka_broker_list', 'kafka_topic_list', 'kafka_group_name', 'kafka_format')
- 必要参数:
- kafka_broker_list:以逗号分隔的 brokers 列表 (localhost:9092)。
- kafka_topic_list: topic 列表 (my_topic)。
- kafka_group_name:Kafka 消费组名称 (group1)。如果不希望消息在集群中重复,请在每个分片中使用相同的组名。
- kafka_format:消息体格式。使用与 SQL 部分的 FORMAT 函数相同表示方法,例如 JSONEachRow、CSV等
- 可选参数:
- kafka_row_delimiter:每个消息体(记录)之间的分隔符。
- kafka_schema:如果解析格式需要一个 schema 时,此参数必填
- kafka_num_consumers:单个表的消费者数量。默认值是:1,如果一个消费者的吞吐量不足,则指定更多的消费者。消费者的总数不应该超过 topic 中分区的数量,因为每个分区只能分配一个消费者。
数据表:
sql
CREATE TABLE external_data_table_name
(
column1 DataType,
column2 DataType,
...
)
ENGINE = MergeTree
物化视图,用于同步数据
sql
CREATE MATERIALIZED VIEW test_mv TO external_data_table_name AS
SELECT
column1,
column2,
...
FROM
external_table_name;
使用示例:
Kafka引擎表:
sql
CREATE TABLE test_Kafka (
id Int64,
name String,
log Decimal(10, 6),
lat Decimal(10, 6),
crt_time DateTime
) ENGINE = Kafka('127.0.0.1:9092', 'test_clickhouse_topic', 'jhdsjkhdjk', 'JSONEachRow');
数据表:
sql
CREATE TABLE test_Kafka_data (
id Int64,
name String,
log Decimal(10, 6),
lat Decimal(10, 6),
crt_time DateTime
) ENGINE = MergeTree
ORDER BY
id;
物化视图:
sql
CREATE MATERIALIZED VIEW test_Kafka_mv TO test_Kafka_data AS
SELECT
id,
name,
log,
lat,
crt_time
FROM
test_Kafka;
RabbitMQ引擎
RabbitMQ 引擎 允许 ClickHouse 直接订阅 RabbitMQ 消息队列,实时消费队列中的消息,并将消息存储到 ClickHouse 的表中。通过这种方式,ClickHouse 可以作为一个高效的数据接收端来处理来自 RabbitMQ 的事件流,特别适用于需要实时处理大规模事件数据的场景。
使用场景:
- 实时数据流处理:从 RabbitMQ 中获取实时产生的事件数据,将其实时写入 ClickHouse 数据库进行分析和存储。
- 日志处理和分析:接收 RabbitMQ 中的日志事件,执行数据清洗、转换,然后存入 ClickHouse 以便于进行高效的日志分析。
- 事件驱动架构:用于基于事件触发的架构,ClickHouse 可以订阅 RabbitMQ 事件队列,实时存储消息内容并进行后续分析。
支持功能:
- 实时消费数据:
RabbitMQ 引擎表本质上是一个消费引擎,ClickHouse 会持续从指定的 RabbitMQ 队列中拉取消息,并将其存储到目标表中。 - 灵活的数据处理:
RabbitMQ 引擎能够处理不同类型的数据流,尤其是当数据结构发生变化时,可以通过 ClickHouse 的表结构定义来适应 RabbitMQ 消息的格式。 - 高吞吐量:
ClickHouse 的高性能特性使得它能够在实时处理流数据时保持较高的吞吐量,适合大规模事件处理和分析。
注意事项:
-
RabbitMQ 引擎表不存储数据
RabbitMQ 引擎表只是一个连接到 RabbitMQ 队列的"虚拟"表,它会在每次查询时从消息队列拉取数据。它不像传统表那样持久化数据,而是作为一个消费端。数据流入该表后,通常会通过物化视图流转到其他存储表。由于其工作机制,它本身并没有存储历史数据,因此不能直接进行查询。
-
消息消费过程
当你创建一个 RabbitMQ 引擎表时,ClickHouse 会持续从指定的 RabbitMQ 队列中拉取消息并将其传递到目标表中。每个查询触发时,它只会拉取尚未消费的消息,而消息一旦被消费并存储在目标表中,它就不再出现在 RabbitMQ 引擎表中。因此,你不能像查询普通表那样直接查询 RabbitMQ 引擎表,它并不持有可查询的历史数据。
-
高吞吐量和实时性
RabbitMQ 引擎表的设计是为了处理高吞吐量的流式数据,其目的是在数据流入系统时尽快地消费并存储。因此,它的结构是针对消息流而非历史查询优化的。如果你需要历史数据查询或更复杂的数据分析,应该依赖于已经将数据持久化到 ClickHouse 常规表中的物化视图 。
为了能够查询 RabbitMQ 消费的消息数据,通常需要设置一个物化视图。物化视图会将从 RabbitMQ 引擎表中消费到的数据写入到一个持久化的 ClickHouse 表中。因此,查询 RabbitMQ 数据的正确方式是查询物化视图所同步的数据,而不是直接查询 RabbitMQ 引擎表。
基本语法:
RabbitMQ引擎表:
sql
CREATE TABLE external_table_name
(
column1 DataType,
column2 DataType,
...
) ENGINE = RabbitMQ
SETTINGS
rabbitmq_host = 'localhost',
rabbitmq_port = 5672,
rabbitmq_user = 'guest',
rabbitmq_password = 'guest',
rabbitmq_queue = 'queue_name',
rabbitmq_exchange = 'exchange_name',
rabbitmq_routing_key = 'routing_key';
- 必要参数:
- rabbitmq_host_port:主机名:端口号 (比如, localhost:5672)
- rabbitmq_exchange_name:RabbitMQ exchange 名称
- rabbitmq_format:消息格式. 使用与SQLFORMAT函数相同的标记,如JSONEachRow。 更多信息,请参阅 Formats 部分
- 可选参数:
- rabbitmq_exchange_type:RabbitMQ exchange 的类型: direct, fanout, topic, headers, consistent_hash. 默认是: fanout
- rabbitmq_routing_key_list:一个以逗号分隔的路由键列表
- rabbitmq_row_delimiter:用于消息结束的分隔符
- rabbitmq_schema:如果格式需要模式定义,必须使用该参数。比如, Cap'n Proto 需要模式文件的路径以及根 schema.capnp:Message 对象的名称
- rabbitmq_num_consumers:每个表的消费者数量。默认:1。如果一个消费者的吞吐量不够,可以指定更多的消费者
- rabbitmq_num_queues:队列的总数。默认值: 1. 增加这个数字可以显著提高性能
- rabbitmq_queue_base - 指定一个队列名称的提示。这个设置的使用情况如下
- rabbitmq_deadletter_exchange:为dead letter exchange指定名称。你可以用这个 exchange 的名称创建另一个表,并在消息被重新发布到 dead letter exchange 的情况下收集它们。默认情况下,没有指定 dead letter exchange。Specify name for a dead letter exchange
- rabbitmq_persistent:如果设置为 1 (true), 在插入查询中交付模式将被设置为 2 (将消息标记为 'persistent'). 默认是: 0
- rabbitmq_skip_broken_messages:RabbitMQ 消息解析器对每块模式不兼容消息的容忍度。默认值:0. 如果rabbitmq_skip_broken_messages = N,那么引擎将跳过 N 个无法解析的 RabbitMQ 消息(一条消息等于一行数据)
- rabbitmq_max_block_size
- rabbitmq_flush_interval_ms
ClickHouse 配置文件添加RabbitMQ 服务器配置(/etc/clickhouse-server/config.xml):
-
必要配置:
xml<rabbitmq> <username>root</username> <password>clickhouse</password> </rabbitmq>
-
可选配置:
xml<rabbitmq> <vhost>clickhouse</vhost> </rabbitmq>
数据表:
sql
CREATE TABLE external_data_table_name
(
column1 DataType,
column2 DataType,
...
)
ENGINE = MergeTree
物化视图,用于同步数据
sql
CREATE MATERIALIZED VIEW test_mv TO external_data_table_name AS
SELECT
column1,
column2,
...
FROM
external_table_name;
使用示例:
RabbitMQ引擎表:
sql
CREATE TABLE test_RabbitMQ (
id Int64,
name String,
log Decimal(10, 6),
lat Decimal(10, 6),
crt_time DateTime
) ENGINE = RabbitMQ
SETTINGS
rabbitmq_host_port = '127.0.0.1:5672',
rabbitmq_exchange_name = 'exchange_fanout_fund_sub',
rabbitmq_routing_key_list = 'topic.*',
rabbitmq_format = 'JSONEachRow';
配置文件(/etc/clickhouse-server/config.xml):
xml
<rabbitmq>
<username>root</username>
<password>clickhouse</password>
</rabbitmq>
数据表:
sql
CREATE TABLE test_RabbitMQ_data (
id Int64,
name String,
log Decimal(10, 6),
lat Decimal(10, 6),
crt_time DateTime
) ENGINE = MergeTree
ORDER BY
id;
物化视图:
sql
CREATE MATERIALIZED VIEW test_RabbitMQ_mv TO test_RabbitMQ_data AS
SELECT
id,
name,
log,
lat,
crt_time
FROM
test_RabbitMQ;
总结:
- RabbitMQ 引擎表 设计为一个 流式消费 表,它不能直接用于查询,因为它并不持久化数据。
- 查询 RabbitMQ 数据时,通常需要通过 物化视图 将数据同步到一个常规的 ClickHouse 表中。
- 如果你直接查询 RabbitMQ 引擎表,通常会发现没有数据,因为这些数据已经被消费并传递到目标表中。
File引擎
File 引擎是一种特殊的表引擎,用于从本地或外部文件系统读取 数据或将数据写入文件。它并不是一个传统的数据库表引擎,而是用于从文件中直接加载数据或者将查询结果导出到文件。File 引擎支持多种格式,如 CSV、TSV、JSON、Parquet 等,适用于快速的数据导入、导出和批量处理场景。
使用场景:
- 数据导入/导出:将本地或外部文件的数据导入到 ClickHouse,或者将 ClickHouse 表中的数据导出到文件中。
- 数据交换:与其他系统共享数据。通过将数据导出为标准文件格式(如 CSV、JSON 或 Parquet),可以方便地与其他数据处理工具进行交互。
- 数据迁移:在不同的数据库之间迁移数据时,可以将数据导出为标准的文件格式,然后导入到目标数据库。
- 临时存储:在处理大数据集时,可以使用 File 引擎暂时存储计算结果,以便后续使用或分析。
注意事项:
- 性能:使用 File 引擎时,读取和写入速度通常较慢,因为它依赖于文件 I/O 操作。对于大规模数据处理,建议使用专门的存储引擎,如 MergeTree 系列。
- 数据一致性:由于数据存储在外部文件中,ClickHouse 不会保证文件的完整性和一致性。文件可能会在处理中被修改或删除,这会导致查询结果不一致。
- 支持的文件格式:不同的文件格式有不同的使用场景,选择合适的文件格式对于性能和存储效率非常重要。例如,对于大数据量的处理,Parquet 或 Avro 格式通常比 CSV 更高效。
- 路径问题:在使用 File 引擎时,确保文件路径是正确的,且 ClickHouse 有权限读取或写入该文件。
常见文件格式:
- CSV (CSV,逗号分隔值)
- TabSeparated (TSV,制表符分隔值)
- TSVWithNames(带列名的 TSV)
- JSONEachRow(JSON,每行一个 JSON 对象)
- Parquet(列式存储格式,适用于大数据处理)
- Avro(二进制格式,常用于数据流处理)
- Protobuf(二进制序列化格式)
基本语法:
sql
CREATE TABLE table_name
(
column1 DataType1,
column2 DataType2,
...
)
ENGINE = File(file_format, 'file_path');
- file_format:文件格式
- file_path:文件路径
使用示例:
-
CSV格式
sqlCREATE TABLE test_File_CSV ( id Int64, name String, log Decimal(10, 6), lat Decimal(10, 6), crt_time DateTime ) ENGINE = File('CSV','/var/lib/clickhouse/user_files/data1.csv');
data1.csv内容
txt1,haha,1.0,2.0,2024-02-02 00:00:00 1,haha,1.0,2.0,2024-02-02 00:00:00
-
JSONEachRow格式
sqlCREATE TABLE test_File_JSONEachRow ( id Int64, name String, log Decimal(10, 6), lat Decimal(10, 6), crt_time DateTime ) ENGINE = File('JSONEachRow','/var/lib/clickhouse/user_files/data2.JSONEachRow');
data2.JSONEachRow内容
txt{"id":1,"name":"John Doe","log":40.712776,"lat":74.005974,"crt_time":"2024-11-28 07:21:38"} {"id":1,"name":"John Doe","log":40.712776,"lat":74.005974,"crt_time":"2024-11-28 07:21:38"} {"id":1,"name":"John Doe","log":40.712776,"lat":74.005974,"crt_time":"2024-11-28 07:21:38"} {"id":1,"name":"John Doe","log":40.712776,"lat":74.005974,"crt_time":"2024-11-28 07:21:38"}
总结:
- ClickHouse 的 File 引擎是一种非常灵活的工具,适用于从文件中读取数据 或将数据导出为不同格式的文件。它支持多种常见的数据格式,并且适用于大多数批量数据处理和数据交换的场景。然而,由于它是基于文件的存储,使用时需要注意性能、文件一致性和格式选择等问题。
URL引擎
URL 引擎是用于从指定的 URL 地址加载数据的引擎。它通常用于处理从外部 Web 服务或者远程文件系统(例如 HTTP 或 FTP 服务器)获取的数据。URL 引擎可以让 ClickHouse直接从指定的 URL 读取数据,并将其插入到指定的表中进行处理和分析。
使用场景:
- 从外部 HTTP/FTP 服务器加载数据:适用于从外部服务器拉取数据进行实时分析。例如,从一个 Web 服务接口获取实时 JSON 数据,或者从 FTP 服务器上获取 CSV 文件。
- 异步数据加载:在某些场景下,ClickHouse 可以通过 URL 引擎异步地从外部 URL 加载数据,以便在分析过程中动态更新数据。
- 集成第三方服务数据:ClickHouse 的 URL 引擎非常适合用来集成外部的第三方数据源,例如从外部提供的数据 API 或者 Web 服务中加载数据。
支持功能:
- 支持的协议:HTTP、HTTPS、FTP、SFTP 等。
- 支持的格式:常见的结构化数据格式,如 CSV、TSV、JSON、TabSeparated、JSONEachRow 等。
注意事项:
- 网络延迟:因为 URL 引擎从远程服务器加载数据,网络延迟可能会影响数据的加载速度。如果 URL 地址响应缓慢,可能会导致数据加载过程变慢。
- 并发限制:从外部服务器加载大量数据时,可能会受到服务器并发请求的限制。需要确保远程服务器支持高并发连接。
- 数据量和资源消耗:从远程服务器加载大量数据时,ClickHouse 可能会占用较多的内存和网络带宽。应确保服务器的资源足够支持大规模数据加载。
- 缓存:ClickHouse 不会缓存 URL 引擎加载的数据。每次查询都会从指定的 URL 获取最新的数据。
- 权限问题:如果你通过 HTTP/FTP 等协议加载数据时,确保 URL 可公开访问或提供了适当的认证信息。ClickHouse 本身不处理 URL 访问的认证。
- 错误处理:如果 URL 指定的资源不可用或格式不正确,ClickHouse 会返回错误,提示无法加载数据。
常见文件格式:
- CSV (CSV,逗号分隔值)
- TabSeparated (TSV,制表符分隔值)
- TSVWithNames(带列名的 TSV)
- JSONEachRow(JSON,每行一个 JSON 对象)
- Parquet(列式存储格式,适用于大数据处理)
- Avro(二进制格式,常用于数据流处理)
- Protobuf(二进制序列化格式)
基本语法:
sql
CREATE TABLE table_name
(
column1 DataType,
column2 DataType,
...
)
ENGINE = URL('URL', file_format);
- file_format:文件格式
- URL:文件URL
使用示例:
-
CSV格式
sqlCREATE TABLE test_URL_CSV ( id Int64, name String, log Decimal(10, 6), lat Decimal(10, 6), crt_time DateTime ) ENGINE = URL('http://127.0.0.1:9002/file/6749543efc3566d2e46b27b0.csv','CSV');
6749543efc3566d2e46b27b0.csv内容
txt1,haha,1.0,2.0,2024-02-02 00:00:00 1,haha,1.0,2.0,2024-02-02 00:00:00
-
JSONEachRow格式
sqlCREATE TABLE test_URL_JSONEachRow ( id Int64, name String, log Decimal(10, 6), lat Decimal(10, 6), crt_time DateTime ) ENGINE = URL('http:///127.0.0.1:9002/file/67495527fc3566d2e46b27b1.JSONEachRow','JSONEachRow');
67495527fc3566d2e46b27b1.JSONEachRow内容
txt{"id":1,"name":"John Doe","log":40.712776,"lat":74.005974,"crt_time":"2024-11-28 07:21:38"} {"id":1,"name":"John Doe","log":40.712776,"lat":74.005974,"crt_time":"2024-11-28 07:21:38"} {"id":1,"name":"John Doe","log":40.712776,"lat":74.005974,"crt_time":"2024-11-28 07:21:38"} {"id":1,"name":"John Doe","log":40.712776,"lat":74.005974,"crt_time":"2024-11-28 07:21:38"}
HDFS引擎
HDFS 引擎允许从 Hadoop 分布式文件系统(HDFS) 中读取和写入数据。HDFS 是一个大数据存储解决方案,通常用于存储大量的结构化或非结构化数据,广泛应用于大数据处理和分析平台。ClickHouse 的 HDFS 引擎为用户提供了与 HDFS 集成的能力,使得在 ClickHouse 中处理和分析存储在 HDFS 上的数据变得简单和高效。
HDFS 引擎允许 ClickHouse 直接从 HDFS 中读取数据,进行分析和计算。它不仅支持将数据写入 HDFS 目录,还能从 HDFS 中读取不同格式的数据进行查询。通过 HDFS 引擎,ClickHouse 可以轻松与 Hadoop 生态系统中的其他组件(如 Hive、Spark 等)集成,并高效地处理大规模数据。
使用场景:
- 大数据集成:将 ClickHouse 作为数据仓库与 Hadoop 大数据生态系统中的其他组件(如 Spark、Hive)结合,处理和分析存储在 HDFS 中的海量数据。
- 日志和事件数据存储:许多大数据平台将日志、传感器数据、监控数据等存储在 HDFS 上,ClickHouse 的 HDFS 引擎可以方便地读取和分析这些数据。
- 分布式文件存储:当数据规模庞大且分布在多个节点上时,HDFS 提供了一个可靠的存储解决方案,而 ClickHouse 的 HDFS 引擎使得查询这些数据成为可能。
支持功能:
- 数据压缩:HDFS 支持多种压缩算法,如 Gzip、Snappy 等。在读取压缩文件时,ClickHouse 会自动处理这些压缩文件格式。
- 分布式读取:ClickHouse 可以并行读取 HDFS 上的数据,从而利用分布式系统的优势加速查询和分析。
- 支持多种格式:HDFS 引擎支持多种存储格式,包括但不限于 CSV、Parquet、ORC 和 JSON 等。用户可以根据数据规模、查询需求和性能考虑选择合适的格式。
注意事项:
- 网络带宽和延迟:HDFS 引擎的性能可能会受到网络带宽和延迟的影响,特别是在跨数据中心或者跨网络访问 HDFS 时。要优化性能,尽量确保 HDFS 集群的节点和 ClickHouse 实例之间的网络连接良好。
- 数据量:读取大量数据时,可能会遇到性能瓶颈。ClickHouse 提供了分布式表和其他优化措施(如分区)来提高大数据量处理的效率。
- 存储格式:不同的存储格式(如 Parquet 或 ORC)对于大数据集的读取性能有显著影响,列式存储格式通常比行式存储格式(如 CSV 或 JSON)更加高效。
基本语法:
sql
CREATE TABLE table_name
(
column1 DataType,
column2 DataType,
...
)
ENGINE = HDFS('path', format);
- path:
HDFS 引擎通过一个 HDFS URI 路径来访问文件。该路径包括 HDFS 的协议(hdfs://)以及实际存储数据的路径。
hdfs://<namenode_host>:/path/to/directory:HDFS 的地址可以是 hdfs://namenode:8020/ 这样的格式。 - format:
- ClickHouse 支持多种数据格式的读取和写入,包括但不限于:
- CSV:逗号分隔的文本格式。
- TSV:制表符分隔的文本格式。
- JSON:JSON 格式。
- Parquet:列式存储格式,适合大规模数据处理。
- ORC:另一种列式存储格式,适合大规模数据。
参考文章:Clickhouse中文档