clickhouse hadoop_如何实现大数据场景下的实时查询 | ClickHouse基础、原理与实践(上)...

这次ClickHouse的主题讨论。我会分三篇来写~

上篇从实操出发谈及ClickHouse的基础功能,并分享自己在实际业务中的经验心得。

中篇会探究一下ClickHouse组成、原理和技术细节,并横向对比例如Kudu、ES等实时数据查询解决方案,分析它们之间的异同与优劣。

下篇是基于某新一线大厂的分享,结合自身经历和对ClickHouse的理解,分(xia)享(bian)一些脱敏后的实践经历。

1、ClickHouse是俄罗斯Yandex于2016年开源的列式存储数据库,主要用于OLAP。

2、命令行模式下的ClickHouse的打开方式

clickhouse-client

--host 127.0.0.1

--port 7000

--user root

--password asdf

--database test

--query "select * from abc"

在实际业务场景中,会有在命令行界面中执行SQL的需要,因此有时要添加一些额外的参数,如下:

clickhouse-client -m #允许多行

clickhouse-client -t #打印执行时间

clickhouse-client -f #指定数据输出格式

clickhouse-client --stacktace #打印堆栈跟踪信息

3、数据类型

(1)Int8、Int16、Int32、Int64:整数

其中,IntN的范围是[-2^(N-1),2^(N-1)-1],N=8,16,32,64

(2)UInt8、UInt16:正整数

U代表无符号

(3)String:字符串

如果需要限定长度,用FixedString(N),可类比varchar

(4)Date、Datetime:时间

(5)Float32、Float64:浮点数

对应float、double,不建议用,会有精度损失(1-0.9 = 0.09999999)

(6)其他

Enum8、Enum16,枚举类型

Array,数组,内部只能单一类型

Tuple,元组,内部可有多个类型

(7)注意

没有Boolean类型,可用枚举替代:Enum8('true'=0,'false'=1)

4、数据引擎的比较维度

(1)内存还是磁盘

(2)支持哪些语句

(3)是否支持并发多线程

(4)是否可以使用索引

(5)是否高可用可复制

5、数据引擎

(1)TinyLog

存在磁盘,不支持索引,支持并发读不支持并发写(不支持并发控制),节省空间,只用于查询

文件结构是列式存储,一列一个文件;还有一个sizes.json存储每一列的大小

(2)Memory

内存中,每秒10G,不支持索引,用于测试,受限于内存大小

(3)Merge

不存数据;合并其他表,后面带两个参数,数据库名、表名的正则

(4)MergeTree

树结构,多个相同枝干自动合并,按主键排序,支持分区,支持副本,支持采样

(5)ReplacingMergeTree

MergeTree基础上,会基于主键删除重复数据,自动定时执行,不保证没有重复数据

(6)SummingMergeTree

MergeTree基础上,会基于主键汇总重复数据,若无法汇总则保留第一条记录

(7)Distrubuted

不存数据,合并集群中的表

(8)HDFS、MySQL等

外部表

(9)ReplicatedMergeTree

在MergeTree前加Replicated的前缀,可以建立副本,需要配置zk,并且需要修改配置

6、建表语句

CREATE TABLE tbl(

edate Date

,boo Enum8('true'=0,'false'=1)

)

ENGINE=TinyLog;

7、不同引擎的语法规则

(1)MergeTree

ENGINE=MergeTree()

PARTITION BY date

ORDER BY (id,name)

PRIMARY KEY ccc #如果不写,默认是orderby的字段

SAMPLE BY dd

SETTINGS

index_granularity = 8192 #索引粒度

use_minimalistic_part_header_in_zookeeper=1 #数据片段头在zk中的存储方式

min_merge_bytes_to_use_direct_io=1 #使用直接IO,适合大量数据,linux中有缓存IO(数据到缓存再到磁盘)和直接IO(数据直接到磁盘)

(2)ReplacingMergeTree

ENGINE=ReplacingMergeTree(col=Int) #col不指定,保留最后一条,指定则保留值最大的那条

PARTITION BY date

ORDER BY (id,name)

PRIMARY KEY ccc

SAMPLE BY dd

SETTINGS

index_granularity = 8192

use_minimalistic_part_header_in_zookeeper=1

min_merge_bytes_to_use_direct_io=1

(3)SummingMergeTree

ENGINE=SummingMergeTree(col=Int) #加总字段

PARTITION BY date

ORDER BY (id,name)

PRIMARY KEY ccc

SAMPLE BY dd

SETTINGS

index_granularity = 8192

use_minimalistic_part_header_in_zookeeper=1

min_merge_bytes_to_use_direct_io=1

(4)Distributed

ENGINE=Distributed(clickhouse_cluser,default,t,id) #根据插入数据的id字段,均匀分发到每个分布表中

(5)外部表

ENGINE=HDFS('hdfs://hadoop:9000/t.csv','CSV')

(6)刷新语句

optimize table tbl

一般不建议使用,因为大数据量级下,刷新需要较长时间和计算的开销

8、常用DDL

(1)SHOW TABLE FROM dbname

(2)CREATE DATABASE dbname

(3)CREATE TABLE tbl

(4)ALTER TABLE

只支持MergeTree、Merge和Distributed引擎

(5)ALTER TABLE tbl ADD|DROP|MODIFY col

(6)DESCRIBE TABLE

(7)CHECK TABLE

只支持Log类引擎

(8)DROP TABLE tbl ON CLUSTER hadoop

批量删除集群中的相同表

9、使用经验

(1)嵌套表时,必须使用AS

select id,name

from (

select a.id as id #这里必须用as,否则外层表读到的是a.id而不是id

,a.name as name #同理

,count(b.subject) as s_cnt

from tbl1 a join tbl2 b on a.id = b.id

group by a.id,a.name

)t

(2)从

ClickHouse导出数据到MySQL,选择建外部表的方案时,会遇到MySQL自增主键的问题,当插入行自增主键列的数据为空时会报错。

解决方案是在ClickHouse的建表语句里不加id字段,并在MySQL实体表建表语句中设置id字段为自增

,这样当我们执行INSERT INTO ClickHouse外表的时候,id字段会以自增的形式自动填充数据。

(3)判断时间是否为今天

WHERE toDate(substring(toString(created_at),1,10)) = today()

(4)建表语句报错Expected one of: column declaration, identifier, list of elements, INDEX, column or index declaration, columns or indices declaration list

检查建表语句中出现多余的逗号

(5)argMax函数

当表中数据出现同一个id多行记录时,只需要取最新的那行数据对应的字段,此时可使用argMax函数,具体方式如下:

select id

,argMax(name,version) as name

,argMax(score,version) as score

from tbl

group by id

在离线Hive场景,通常是用开窗函数row_number()来处理,但ClickHouse贴心地用聚合函数帮我们解决了这个问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据分析职业是一个多金的职业,数据分析职位是一个金饭碗的职位,前景美好,但是要全面掌握大数据分析技术,非常困难,大部分学员的痛点是不能快速找到入门要点,精准快速上手。本课程采用项目驱动的方式,以Spark3和Clickhouse技术为突破口,带领学员快速入门Spark3+Clickhouse数据分析,促使学员成为一名高效且优秀的大数据分析人才。学员通过本课程的学习,不仅可以掌握使用Python3进行Spark3数据分析,还会掌握利用Scala/java进行Spark数据分析,多语言并进,力求全面掌握;另外通过项目驱动,掌握Spark框架的精髓,教导Spark源码查看的技巧;会学到Spark性能优化的核心要点,成为企业急缺的数据分析人才;更会通过Clickhouse和Spark搭建OLAP引擎,使学员对大数据生态圈有一个更加全面的认识和能力的综合提升。真实的数据分析项目,学完即可拿来作为自己的项目经验,增加面试谈薪筹码。课程涉及内容:Ø  Spark内核原理(RDD、DataFrame、Dataset、Structed Stream、SparkML、SparkSQL)Ø  Spark离线数据分析(千万简历数据分析、雪花模型离线数仓构建)Ø  Spark特征处理及模型预测Ø  Spark实时数据分析(Structed Stream)原理及实战Ø  Spark+Hive构建离线数据仓库(数仓概念ODS/DWD/DWS/ADS)Ø  Clickhouse核心原理及实战Ø  Clickhouse engine详解Ø  Spark向Clickhouse导入简历数据,进行数据聚合分析Ø  catboost训练房价预测机器学习模型Ø  基于Clickhouse构建机器学习模型利用SQL进行房价预测Ø  Clickhouse集群监控,Nginx反向代理Grafana+Prometheus+Clickhouse+node_exporterØ  Spark性能优化Ø  Spark工程师面试宝典       课程组件:集群监控:福利:本课程凡是消费满359的学员,一律送出价值109元的实体书籍.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值