专业格泰建站,分销系统什么意思,wordpress速度插件,h5网站开发流程进入正文前#xff0c;感谢宝子们订阅专题、点赞、评论、收藏#xff01;关注IT贫道#xff0c;获取高质量博客内容#xff01; #x1f3e1;个人主页#xff1a;含各种IT体系技术#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 … 进入正文前感谢宝子们订阅专题、点赞、评论、收藏关注IT贫道获取高质量博客内容 个人主页含各种IT体系技术IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 订阅拥抱独家专题你的订阅将点燃我的创作热情 点赞赞同优秀创作你的点赞是对我创作最大的认可 ⭐️ 收藏收藏原创博文让我们一起打造IT界的荣耀与辉煌 ✏️评论留下心声墨迹你的评论将是我努力改进的方向 目录
1. HDFS
1.1 语法
1.2 其他配置
1.3 示例
2. MySQL
2.1 语法
2.2 示例
2.3 测试 replace_query
2.4 测试 on_duplicate_clause
3. Kafka
3.1 语法
3.2 示例
3.3 示例 ClickHouse提供了许多与外部系统集成的方法包括一些表引擎。这些表引擎与其他类型的表引擎类似可以用于将外部数据导入到ClickHouse中或者在ClickHouse中直接操作外部数据源。
1. HDFS
HDFS引擎支持ClickHouse 直接读取HDFS中特定格式的数据文件目前文件格式支持Json,Csv文件等ClickHouse通过HDFS引擎建立的表不会在ClickHouse中产生数据读取的是HDFS中的数据将HDFS中的数据映射成ClickHouse中的一张表这样就可以使用SQL操作HDFS中的数据。
ClickHouse并不能够删除HDFS上的数据当我们在ClickHouse客户端中删除了对应的表只是删除了表结构HDFS上的文件并没有被删除这一点跟Hive的外部表十分相似。
1.1 语法
ENGINE HDFS(URI, format)
注意URI是HDFS文件路径format指定文件格式。HDFS文件路径中文件为多个时可以指定成some_file_?或者当数据映射的是HDFS多个文件夹下数据时可以指定somepath/* 来指定URI
1.2 其他配置
由于HDFS配置了HA 模式有集群名称所以URI使用mycluster HDFS集群名称时ClickHouse不识别这时需要做以下配置
将hadoop路径下$HADOOP_HOME/etc/hadoop下的hdfs-site.xml文件复制到/etc/clickhouse-server目录下。修改/etc/init.d/clickhouse-server 文件加入一行 “export LIBHDFS3_CONF/etc/clickhouse-server/hdfs-site.xml”重启ClickHouse-server 服务
serveice clickhouse-server restart
当然这里也可以不做以上配置在写HDFS URI时直接写成对应的节点端口即可。
1.3 示例
#在HDFS路径 hdfs://mycluster/ch/路径下创建多个csv文件写入一些数据c1.csv文件内容:1,张三,192,李四,20c2.csv文件内容:3,王五,214,马六,22#创建表 t_hdfs,使用HDFS引擎node1 :) create table t_hdfs(id UInt8,name String,age UInt8) engine HDFS(hdfs://mycluster/ch/*.csv,CSV)#查询表 t_hdfs中的数据node1 :) select * from t_hdfs;┌─id─┬─name─┬─age─┐│ 3 │ 王五 │ 21 ││ 4 │ 马六 │ 22 │└────┴──────┴─────┘┌─id─┬─name─┬─age─┐│ 1 │ 张三 │ 19 ││ 2 │ 李四 │ 20 │└────┴──────┴─────┘注意这里表t_hdfs不会在clickhouse对应的节点路径下创建数据目录同时这种表映射的是HDFS路径中的csv文件不能插入数据t_hdfs是只读表。#创建表 t_hdfs2 文件 使用HDFS引擎node1 :) create table t_hdfs2(id UInt8,name String,age UInt8) engine HDFS(hdfs://mycluster/chdata,CSV);#向表 t_hdfs2中写入数据node1 :) insert into t_hdfs2 values(5,田七,23),(6,赵八,24);#查询表t_hdfs2中的数据node1 :) select * from t_hdfs2;┌─id─┬─name─┬─age─┐│ 5 │ 田七 │ 23 ││ 6 │ 赵八 │ 24 │└────┴──────┴─────┘注意t_hdfs2表没有直接映射已经存在的HDFS文件这种表允许查询和插入数据。
2. MySQL
ClickHouse MySQL数据库引擎可以将MySQL某个库下的表映射到ClickHouse中使用ClickHouse对数据进行操作。ClickHouse同样支持MySQL表引擎即映射一张MySQL中的表到ClickHouse中使用ClickHouse进行数据操作与MySQL数据库引擎一样这里映射的表只能做查询和插入操作不支持删除和更新操作。
2.1 语法
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster](name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],...) ENGINE MySQL(host:port, database, table, user, password[, replace_query, on_duplicate_clause]);
以上语法的解释如下
host:port - MySQL服务器名称和端口database - MySQL 数据库。table - 映射的MySQL中的表user - 登录mysql的用户名password - 登录mysql的密码replace_query - 将INSERT INTO 查询是否替换为 REPLACE INTO 的标志,默认为0不替换。当设置为1时所有的insert into 语句更改为 replace into 语句。当插入的数据有重复主键数据时此值为0默认报错此值为1时主键相同这条数据默认替换成新插入的数据。on_duplicate_clause - 默认不使用。当插入数据主键相同时可以指定只更新某列的数据为新插入的数据对应于on duplicate key 后面的语句其他的值保持不变需要replace_query 设置为0。
2.2 示例
#在mysql 中创建一张表 t_ch,指定id为主键CREATE TABLE t_ch (id INT,NAME VARCHAR (255),age INT,PRIMARY KEY (id))#向表中增加一些数据insert into t_ch values (1,张三,18),(2,李四,19),(3,王五,20)#在ClickHouse中创建MySQL引擎表 t_mysql_enginenode1 :) create table t_mysql_engine (:-] id UInt8,:-] name String,:-] age UInt8:-] )engine MySQL(node2:3306,test,t_ch,root,123456);#查询ClickHouse表 t_mysql_engine 中的数据node1 :) select * from t_mysql_engine;┌─id─┬─name─┬─age─┐│ 1 │ 张三 │ 18 ││ 2 │ 李四 │ 19 ││ 3 │ 王五 │ 20 │└────┴──────┴─────┘#在ClickHouse中向表 t_mysql_engine中插入一条数据node1 :) insert into t_mysql_engine values (4,马六,21);┌─id─┬─name─┬─age─┐│ 1 │ 张三 │ 18 ││ 2 │ 李四 │ 19 ││ 3 │ 王五 │ 20 ││ 4 │ 马六 │ 21 │└───┴─────┴───┘#在ClickHouse中向表 t_mysql_engine中再插入一条数据这里主键重复报错。node1 :) insert into t_mysql_engine values (4,田七,22);Exception: mysqlxx::BadQuery: Duplicate entry 4 for keyPRIMARY (node2:3306).注意在clickhouse 中 t_mysql_engine表不会在ClickHouse服务器节点上创建数据目录。
2.3 测试 replace_query
#在mysql 中删除表 t_ch,重新创建指定id为主键CREATE TABLE t_ch (id INT,NAME VARCHAR (255),age INT,PRIMARY KEY (id))#向表中增加一些数据insert into t_ch values (1,张三,18),(2,李四,19),(3,王五,20)#在ClickHouse中删除MySQL引擎表 t_mysql_engine重建node1 :) create table t_mysql_engine (:-] id UInt8,:-] name String,:-] age UInt8:-] )engine MySQL(node2:3306,test,t_ch,root,123456,1);#查询ClickHouse表 t_mysql_engine 中的数据node1 :) select * from t_mysql_engine;┌─id─┬─name─┬─age─┐│ 1 │ 张三 │ 18 ││ 2 │ 李四 │ 19 ││ 3 │ 王五 │ 20 │└────┴──────┴─────┘#在ClickHouse中向表 t_mysql_engine中插入一条数据主键重复。这里由于指定了replace_query 1 ,所以当前主键数据会被替换成新插入的数据。node1 :) insert into t_mysql_engine values (3,马六,21);#查询ClichHouse t_mysql_engine表数据node1 :) select * from t_mysql_engine;┌─id─┬─name─┬─age─┐│ 1 │ 张三 │ 18 ││ 2 │ 李四 │ 19 ││ 3 │ 马六 │ 21 │└────┴──────┴─────┘
2.4 测试 on_duplicate_clause
#在mysql 中删除表 t_ch,重新创建指定id为主键CREATE TABLE t_ch (id INT,NAME VARCHAR (255),age INT,PRIMARY KEY (id))#向表中增加一些数据insert into t_ch values (1,张三,18),(2,李四,19),(3,王五,20)#在ClickHouse中删除MySQL引擎表 t_mysql_engine重建node1 :) create table t_mysql_engine (:-] id UInt8,:-] name String,:-] age UInt8:-] )engine MySQL(node2:3306,test,t_ch,root,123456,0,update age values(age));#查询ClickHouse表 t_mysql_engine 中的数据node1 :) select * from t_mysql_engine;┌─id─┬─name─┬─age─┐│ 1 │ 张三 │ 18 ││ 2 │ 李四 │ 19 ││ 3 │ 王五 │ 20 │└────┴──────┴─────┘#在ClickHouse 中向表 t_mysql_engine中插入一条数据node1 :) insert into t_mysql_engine values (4,马六,21);┌─id─┬─name─┬─age─┐│ 1 │ 张三 │ 18 ││ 2 │ 李四 │ 19 ││ 3 │ 王五 │ 20 ││ 4 │ 马六 │ 21 │└──┴─────┴────┘#在ClickHouse中向表 t_mysql_engine中插入一条数据主键重复。node1 :) insert into t_mysql_engine values (4,田七,100);#查询ClichHouse t_mysql_engine表数据node1 :) select * from t_mysql_engine;┌─id─┬─name─┬─age─┐│ 1 │ 张三 │ 18 ││ 2 │ 李四 │ 19 ││ 3 │ 王五 │ 20 ││ 4 │ 马六 │ 100 │└────┴──────┴─────┘
3. Kafka
ClickHouse中还可以创建表指定为Kafka为表引擎这样创建出的表可以查询到Kafka中的流数据。对应创建的表不会将数据存入ClickHouse中这里这张kafka引擎表相当于一个消费者消费Kafka中的数据数据被查询过后就不会再次被查询到。
3.1 语法
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster](name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...) ENGINE Kafka()SETTINGSkafka_broker_list host:port,kafka_topic_list topic1,topic2,...,kafka_group_name group_name,kafka_format data_format[,]
对以上参数的解释
kafka_broker_list: 以逗号分隔的Kafka Broker节点列表kafka_topic_list topic列表kafka_group_name kafka消费者组名称kafka_format : Kafka中消息的格式例如JSONEachRow、CSV等等具体参照https://clickhouse.tech/docs/en/interfaces/formats/。这里一般使用JSONEachRow格式数据需要注意的是json字段名称需要与创建的Kafka引擎表中字段的名称一样才能正确的映射数据。
3.2 示例
#创建表 t_kafka_consumer ,使用Kafka表引擎node1 :) create table t_kafka_consumer (:-] id UInt8,:-] name String,:-] age UInt8:-] ) engine Kafka():-] settings:-] kafka_broker_listnode1:9092,node2:9092,node3:9092,:-] kafka_topic_listck-topic,:-] kafka_group_namegroup1,:-] kafka_formatJSONEachRow;#启动kafka,在kafka中创建ck-topic topic,并向此topic中生产以下数据创建topic:kafka-topics.sh --zookeeper node3:2181,node4:2181,node5:2181 --create --topic ck-topic --partitions 3 --replication-factor 3生产数据kafka-console-producer.sh --broker-list node1:9092,node2:9092,node3:9092 --topic ck-topic生产数据如下{id:1,name:张三,age:18}{id:2,name:李四,age:19}{id:3,name:王五,age:20}{id:4,name:马六,age:21}{id:5,name:田七,age:22}#在ClickHouse中查询表 t_kafka_consumer数据可以看到生产的数据node1 :) select * from t_kafka_consumer;┌─id─┬─name─┬─age─┐│ 2 │ 李四 │ 19 ││ 5 │ 田七 │ 22 ││ 1 │ 张三 │ 18 ││ 4 │ 马六 │ 21 ││ 3 │ 王五 │ 20 │└────┴──────┴─────┘注意再次查看表 t_kafka_consumer数据 我们发现读取不到任何数据这里对应的ClikcHouse中的Kafka引擎表只是相当于是消费者消费读取Kafka中的数据数据被消费完成之后不能再次查询到对应的数据。
以上在ClickHouse中创建的Kafka引擎表 t_kafka_consumer 只是一个数据管道当查询这张表时就是消费Kafka中的数据数据被消费完成之后不能再次被读取到。如果想将Kafka中topic中的数据持久化到ClickHouse中我们可以通过物化视图方式访问Kafka中的数据可以通过以下三个步骤完成将Kafka中数据持久化到ClickHouse中
创建Kafka 引擎表,消费kafka中的数据。再创建一张ClickHouse中普通引擎表这张表面向终端用户查询使用。这里生产环境中经常创建MergeTree家族引擎表。创建物化视图将Kafka引擎表数据实时同步到终端用户查询表中。
3.3 示例
#在ClickHouse中创建 t_kafka_consumer2 表使用Kafka引擎node1 :) create table t_kafka_consumer2 (:-] id UInt8,:-] name String,:-] age UInt8:-] ) engine Kafka():-] settings:-] kafka_broker_listnode1:9092,node2:9092,node3:9092,:-] kafka_topic_listck-topic,:-] kafka_group_namegroup1,:-] kafka_formatJSONEachRow;#在ClickHouse中创建一张终端用户查询使用的表使用MergeTree引擎node1 :) create table t_kafka_mt(:-] id UInt8,:-] name String,:-] age UInt8:-] ) engine MergeTree():-] order by id#创建物化视图同步表t_kafka_consumer2数据到t_kafka_mt中node1 :) create materialized view view_consumer to t_kafka_mt:-] as select id,name,age from t_kafka_consumer2;注意物化视图在ClickHouse中也是存储数据的create materialized view view_consumer to t_kafka_mt 语句是将物化视图view_consumer中的数据存储到到对应的t_kafka_mt 表中这样同步的目的是如果不想继续同步kafka中的数据可以直接删除物化视图即可。#向Kafka ck-topic中生产以下数据生产数据kafka-console-producer.sh --broker-list node1:9092,node2:9092,node3:9092 --topic ck-topic生产数据如下{id:1,name:张三,age:18}{id:2,name:李四,age:19}{id:3,name:王五,age:20}{id:4,name:马六,age:21}{id:5,name:田七,age:22}#查询表 t_kafka_mt中的数据数据同步完成。node1 :) select * from t_kafka_mt;┌─id─┬─name─┬─age─┐│ 1 │ 张三 │ 18 ││ 2 │ 李四 │ 19 ││ 3 │ 王五 │ 20 ││ 4 │ 马六 │ 21 ││ 5 │ 田七 │ 22 │└────┴──────┴─────┘ 如需博文中的资料请私信博主。