Clickhouse 外部存储引擎

文章目录


外部存储引擎分类

引擎类型 描述 特点
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:文件路径

使用示例:

  1. CSV格式

    sql 复制代码
    CREATE 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内容

    txt 复制代码
    1,haha,1.0,2.0,2024-02-02 00:00:00
    1,haha,1.0,2.0,2024-02-02 00:00:00
  2. JSONEachRow格式

    sql 复制代码
    CREATE 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

使用示例:

  1. CSV格式

    sql 复制代码
    CREATE 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内容

    txt 复制代码
    1,haha,1.0,2.0,2024-02-02 00:00:00
    1,haha,1.0,2.0,2024-02-02 00:00:00
  2. JSONEachRow格式

    sql 复制代码
    CREATE 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中文档

相关推荐
授客4 天前
ClickHouse 物化视图学习总结
clickhouse·物化视图·aggregatefunction·aggregatingmergetree
小灰灰__8 天前
[在线实验]-在docker中运行clickhouse
clickhouse·docker
岙利岙10 天前
ClickHouse数据迁移(远程)
clickhouse
码界孔乙己11 天前
MySQL大表实时同步到ClickHouse的方案
数据库·mysql·clickhouse
北漂IT民工_程序员_ZG11 天前
docker安装clickhouse(单机版)
java·clickhouse·docker
爱上口袋的天空14 天前
10 - Clickhouse集群部署以及副本和分片
数据库·clickhouse
wending-Y15 天前
clickhouse 使用global in 优化 in查询
clickhouse