00:00
那我们来先看一下第一章入门,那首先我们了解一下click house的一个背景。那是来自于咱们的奋斗民族啊俄罗斯,那么它是由一个叫young的公司开源的,一六年对吧,那你看咱们目前是二一年,其实它开源的时间还算比较早的,那这个公司是什么呢?这个其实它就相当于说咱们国内的百度,他也是做啥呢。做搜索起家的啊,搜索引擎。当然了,它还提供了其他的服务,对吧,就跟百度一样,做大之后它也有相关其他业务,那最核心的业务就是一个搜索。就也有点像咱们那个谷歌对吧?啊,如果从全球角度来讲,最大的当然是谷歌了,那本地化来讲,俄罗斯里面就样的是最大,那我们国内那肯定是什么百度啊,就类似的啊。
01:00
那这点区别于咱们其他框架,其实咱们了解其他框架大部分是美国那那块开源的,对吧,那这个是俄罗斯战斗民族啊。咱们在使用的过程中也能感觉到它的什么呢,简单粗暴直接对吧。这就是一个他的风格好,另外一个特点,它是一个什么劣势的存储数据库。什么叫劣势啊,是不是咱们正常一张表有行有列啊,那如果是买蛇它是不是。一个传统的一个行式存储,它是不是一行数据存一起,接下来再存下一行对吧,下一行数据再接着存一行一行存的列式呢?无非就是按列来存,一列一列来存,那我们之前了解过的一些,呃,数据库里面有哪些是列式的?啊对,是不是H啊。对吧,所以我们click house经常呢拿来跟h base做一个对比。也是一个,而且贝斯也是一个劣势的啊,那我们也知道劣势适合什么呢。
02:06
是不是op的场景啊?那相对比较另外一个叫OTP。这个是联机事物处理,那咱们OIP呢,是一个联机。查询处理对吧?那说白了OTP以谁为代表啊,像MYSQL这种关系型数据库,还有Oracle等等,对吧?它适合做一些增删改查c rud对吧?那么咱们的OAAP主要是什么呢?A,对吧,是分析这个单词的一个缩写,它适合做一些一次插入多次查询,对吧?可能会做一些聚合统计等等。但是他对于更新。删除等等啊,就不太擅长了。所以大家要明确它的一个定位啊,它是分析型数据库啊,分析型那也后续就关于它的更新删除怎么来实现呢?咱们也会介绍,其实他也不是特别好实现,跟h base也一样嘛,其实啊,另外我们要了解一个它的一个源码主要是用什么写的啊,是一个C加加。
03:12
C加加。那么他也怎么来使用呢?是不是一个搜狗查询呢?这是咱们要了解的几个点啊,也就是说第一个是什么呢?他的公司名字来自于俄罗斯的young战斗名字,第二一个它是烈士的存储数据库。第三一个源码是C加加,第四一个它适合op。第五一个它也是蛇口化来操作的啊,就这么几个。这是它的一个基本情况,那我们来聊聊它的一个特点,首先第一个列式存储。列式存储,那什么叫列式存储呢?相信有了解过的同学应该都比较熟悉了,那我们还是简单介绍一下吧,比如说这是一张表,那你看我们有几个字段,一个是ID name age,那下面是一行一行的数据,那如果是行式存储,它是什么样呢?它是这样,这是一行数据对吧?那么它就存在一起,你看这是不是一整行数据啊?
04:18
那么接下来下面这一行数据,它也在存一起。再下一行数据重新起,大家很很明显感觉到他是不是按行查的呀。啊,暗行存储的呀。对吧,但是呃,我们再先看一下列式的一个存储特点,所谓列式就是什么呢?一列存在一起,你看比如说ID这一列是不是123,那你看存的时候是不是先存的这一列。对吧,你跟上面做一个对比。它是行,下面是列,当然咱们是简单的来理解啊,那接下来第二一列内名字,你看它是不是三,呃,这一列的数据从一起了。在后面一列H乘以起来。
05:01
好,这是咱们对他一个直观的理解,那么大家想想哪一种?更好呢?哪一种更好?其实没有谁好谁坏啊,那么大家想想咱们写的circle,咱们写一些circle的时候怎么写的select,然后写会写什么呢?哎,对,是不是字段呢?是某某字段,某某字段from哪张表对吧,哪个table,那你有过滤过滤,再有其他等等,但我们核心看这里。这我们查的时候是不是查字段,你要么查内,要么查A,要么查ID对吧,那你想想,那在我们的查询里面,主要是查询是不是主要按例为主会快一点,甚至说你做一些聚合的操作,比如说count。等等,还有上它是不是也是对列进行聚合呀。对不对,所以我们说呢,一般咱们劣势存储更适合用来一个查询的一个场景。
06:03
查询分析,也就是说白了,更适合咱们一个大数据分析的一个场景啊,更多会使用这种,那么行式存储呢,是一些增删改查都需要的时候,你想想我要插入一行数据。比如说再插一行啊,这个是四,呃,名字某某。啊年龄啊18你要插入这一行的话,行跟列哪个快,是不是行会快一点,因为你是不是直接把整行数据。往后面添就行了,是不是在一块啊紧凑的,那如果是列式存储,我用蓝色表示,你看你这个ID4是不是得在这插一下名字是不是得在这插一下。对吧,年龄得在这查一下。那这个时候它是不是有一个选址的过程啊,相对来讲就会稍微的慢那么一点,对吧,所以它也不适合这种其他的场景,劣势存储更适合一个查询的场景啊。
07:03
好,那下面咱们也列了一点对吧,这个大家瞅一瞅就行了啊,更适合什么呢?对列的聚合计数求和对吧,更好呃。另外一个更加容易进行压缩,因为它的存储结构会更加的一个紧凑啊,更加的紧凑,它的压缩比就会更高了。那说白了,你考虑到压缩是什么场景,是不是数据量怎么样大,对吧,如果你数据量不大,你还压缩个啥呀,没意义。啊,所以。更适合,所以大家想想咱们hi里边是不是经常也会用一个列式存储啊,对吧,OS也好,PA也好是不是好,呃,还有一个。对于缓存也有一个更大的发挥空间,这是因为什么呢?因为它节省了磁盘空间嘛,因为你本来就紧凑嘛,其实这个可以算同一个啊,主要是这几个优点,这是第一个劣势,存储大家比较熟悉了,还有一个DBMS的功能。
08:10
那这边主要什么呢?它几乎覆盖了咱们标准的一个什么S大部分语法,也就是说你上手使用起来。没有太大的难度,如果你之前啊,对circle比较熟悉的话,就滴滴眼咱们的一些相关的建表语句对吧?什么create table啊,然后定义字段啊,字段名集类型在后面什么啊,比如说有一个分区啊,还有组件啊等等,它的用法都很类似,还有DML,比如说咱们的一些呃,查询语句啊等等等等,它都是。差不多的啊,那还有相关的各种函数,比如说count啊,Sum这些大家都很熟了啊,那另外呢,就是什么呢,它也提供了一些其他的什么权限的管理,用户的管理啊。
09:01
这个都一样啊,你类比一下咱们的hi base等等,其实咱们登录的时候是不是也可以做一个用户的认证啊,对吧,需要用户名密码,那不同的用户我甚至可以加一个权限啊,有的用户。呃,可能只有某些库,某些表查询的权限,有些用户权限比较大,它甚至可以修改数据,删除数据,对吧?那另外一个安全性考虑呢,它可以做一个备份及恢复,这个常规数据库都会有的,都有这个功能,比如说你你那个MYSQL是不是可以通过单命令把整个数据库备份下来。还有数据啊,然后还可以把它恢复进去啊,都一样,这些都是比较常规操作吧啊。还有一个多样化的引擎啊,这个引擎是什么呢?不是咱们在第四章会聊到的一个表引擎,它其实还有一个东西叫什么库引擎,它分为两大类啊,分为两大类,那这个引擎就跟咱们那个MYSQ一样。
10:03
刚才也提到过了,是不是有一个my circlel,是不是有一个no DB,还有一个me DB,对吧?他们也是不同的表引擎,那么在比较高的版本的my circle里面默认是不是no DB啊?那它俩有什么区别对吧,咱们简单呃聊一聊嘛,那最重要的特点是不是DB,它提供了一个什么事物。对吧,那me DB是没有事物啊,没有事物,那所以咱们更常用的是一个no DB也是一个默认的这种,就是不同的一个表引擎,那咱们house呢,它的引擎就比较多了,它分为。合并术,还有日志接口,还有其他四大类,一共20多种引擎。啊,这四个是分类啊,不是四四不是四个啊,是四种,每一个里面又分有好多个,每一个里面有好多个,那咱们最常用的是哪一个呢?合并数。
11:01
啊叫merger tree,这个merger它是一个家族,也就是说它里面有很多了啊,很多衍生的一个引擎,这个咱们聊到后面再去聊啊。还有一个高吞吐的一个写入能力,高吞吐嘛,那一听啊,又是优点又是吹牛逼对吧,那其实并不是,他真的是很强,那我们先来看看它采用了一个什么lsm。这个东西应该不陌生。咱们在哪见过是买。他也是用的这种啊。对吧,那它是什么特点,大家可以简单想一想啊,那你看他他写数据的时候,是不是先写入到一个缓存呢。我们说这辈子。先写入到一个缓存对吧,那完事之后他还管吗?他说不管呢,那h base自己定期会进行一个动作叫什么。
12:02
合并。对吧。进行一个合并,那它合并的时候才会真正去删除咱们所谓的呃,过期的数据啊,还有标记为删除的一些数据啊。对吧,它并不是直接实时的把数据给更改掉啊。它有这么一个过程,那么大家想想,而且贝斯那这就有一个问题了啊,就是如果我数据。呃,有多次插入对同一条数据,相当于说更新嘛,类似更新的操作,那么h base怎么实现说我查到了一定是最新的数据呢?他是不是有一个东西呀。时间戳来控制啊。而且,而且是不是也支持一个多版本。是吧,多版本,那他自己每次每次查呢,其实他历史的数据还在,但是他会根据时间戳获取到最新的那版本,我们默认是一个对吧,那就最新的一个版本,那他只会把最新的这这条数据展示出来。
13:07
但是老的数据并没有真正的删除,什么时候删删除呢?就是到执行合并的时候啊,就大合并,而且贝斯有一个大合并对吧,那这这个咱们简单回忆一下啊,我们类比一下,那click house也是一样的啊。克里house也是一样的,那聊到这个咱们回头,呃,克里house它更新数据怎么实现呢?怎么更新呢?下面它跟h base也类似,你更新的话,它老的数据还在,但新的数据也有,相对来说既有老的也有新的,但它不一定是通过时间戳啊,它有新增几个字段来做一个什么标记。比如说有个叫版本号的。那你想想我要查新的数据,怎么查到啊,是不是版本号大的呀?
14:01
对吧,版本号大的就代表新的数据,那么它也是在合并的时候才会把这条老的数据真正的给删掉。这个其实道理都一样嘛,所以咱们其实学了很多房价,你做一个类比就很好理解啊。这个咱们到后面再来聊,聊到这个引擎的时候啊,聊到引擎的时候,它也有说白了它有一个什么合并动作啊,那另外呢,这个关于这个l SM tree的结构呢,它在数据写入的时候,它是什么。顺序追加险。顺序追加写,那么大家应该知道,咱们以前在聊卡不卡的时候,呃,他卡不卡为什么高效啊,他是不是因为它是顺序写啊,那对比随机写他们的差距有多大呀。是不是6000倍啊,这是官方给的数据对吧,6000倍数据写的效率是极高的。那么写入后不可更改。
15:03
当然了,你。那我们说了更新怎么办,刚才也聊了对吧,打个版本号标记嘛,对吧,好。那么他在合并时候。在执行合并的时候也是一个什么。Me salt是不是归并排序啊,归并排序后再写回磁盘对吧?这就是它合并做的一个事儿,那么其实大家可以想一想,它合并是不是会影响。一些性能,也就是说我合我在合并期间是不是不能对外正常提供服务啊。是吧,所以这一块也是咱们注意的一个点啊,啊,咱们先简单知道一下啊,回头再聊啊,那即便在。普通磁盘上也有一个优异的写入性能,对吧。那基本上能达到什么呢?官方的一个压测。Benchmark就是咱们常用的一个压测工具嘛,啊,那咱们能达到几百兆每秒啊。
16:02
还行,速度特别快啊,这是它高吞吐,所以咱们记住这块要记住什么呢?第一个它采用的是。LSMT这么一个结构,定期合并。另外它是顺序写。这两个点啊,顺序写啊,所以它快嘛。那还有一个数据分区与线程级的并行,这讲的是什么?首先两块,第一个数据的分区,第二个线程级的并行数据分区,这个应该不陌生呗,说白了,Have have是不是也有分区这个?功能啊,那我们说分区的目的是什么,是不是避免一个全表扫描啊是吧?呃,那他click click house同样提供了这种功能啊,多个partition。那么它呢,还有一个线程级并行,什么意思啊,这也是他快的一个原因所在,来大家看这一块。
17:03
单条查询就能利用整机所有的CPU。这样是不是就快了,说白了就是它的并行能力特别强,他但是同时也反应了一点,可这个house是不是特别吃CPU啊。对吧,这个大家能想到的,那还有一点就是什么呢?如果这是单调啊,他就把所有的资源用光了。那你想想,如果我有多条呢?我一秒钟有很多个查询请求啊,那是不是资源就不够用了。所以呢,它的缺陷也很简单,它对于什么高QPS它并不强,因为它单个查询都要占用很多的资源啊。快的同时,你也得舍弃掉一些东西,对吧?那什么叫QPS呢?Query per second。也就每秒钟的查询次数。
18:02
每秒钟的查询次数。这个就是咱们对他的一个了解啊,那另外这一点我希望大家能够记住啊,因为克卡house未来你使用碰到一些问题,大部分出在哪里啊。CPU是一个瓶颈。对吧,他快的同时他也吃CPU,那可能CPU不够,甚至你的查询频率太高了,也就QPS太高了,他也扛不住啊。这是它的一个缺,算是一个缺点吧,不适合的一个场景,这个大家要一定要留下一个深刻的印象啊,吃CPU。那么大家也可以想想,那,那肯定house。那你是不是觉得QBS这么低,这不好使啊,但其实不是啊,它有适合的场景啊,你想想咱们做数仓离线也好,实施也好,是不是很多时候会拉一个宽表啊。
19:02
那你想想宽表咱们是不是都是一个呃,处理完的一些数据啊。对吧。那我们可能就在上面就是做一些查询统计聚合这样而已,那像这种呢,它就特别的擅长了啊,所以我们对click house的使用,它其实不适合做什么,不适合做初始的一个存储。啊,不适合做初始的重组,它适合做你已经处理过的大量的字段特别多的这种宽表。这是它很适合的一个场景,对吧,所以大家未来架构考虑的时候也要想明白这一点啊。要根据它的特点来考虑啊,它比较适合存储一些宽表的这种场景。那最后一个性能对比呢,这一块呢,这是咱们在网上呃,拿到的一个结果啊,拿到一个结果咱们直接来看一眼就行了,它主要是对几个数据库做了一个对比,首先分为一个单表查询,一个关联查询。
20:08
什么叫单表了?就我只查一张表,我FROM1张表,关联查询呢?是不是做了一个什么join多表关联嘛。就A表join b表,那你是不是两张表关联对吧?好,那我们先来看一看吧,单表查询里面,呃,有几个咱们应该认识的一个pstalala。Circle。Click house have,那GP呢,可能有些没接触过对吧,那咱们先还有这两个,这两个咱们就先不去看了,那我们看看啊,它这边是有实行不同数据量的circle,当然circle咱们粘出来,我们就看一下对比就行。你看这个时间。大家看看这个时间。Have,不用讲他是不是时间是最久的,那这个是秒还是毫秒呢?这个不用去纠结,咱们看这个量级就行了呗,这应该是秒啊,应该是秒。
21:09
那你看啊。基于内存的in paraa,基于内存的他们都要200秒左右,是不是那18个so主要也是基于内存,跑了也要300秒,但是click click house只要多少呢?85就够了,Have,不用缴了4000多对吧,没有可比性啊,那你可在这里咱们可以看到这个耗时的一个性了。当然这是单条对吧,单条。这也是他的优势所在啊,他查的特别快,那还有一个关联查询。对,那其实可house由于它的一个特点呢,它对join的实现是比较奇葩的,比较奇葩。另外呢,后面的版本它也做了一些改进,但是效果还是不太好啊,所以咱们其实使用click house的时候要尽量避免什么呢?避免避免的一个做join的一个操作,咱们在高级部分也谈到了,如果你非要做join,那你应该怎么去实现会更加的好啊,这是跟它的底层实现原理有关的啊,底层实现原理有关,那我们先看看一个对比。
22:18
200。In 200左右,18个烧口,700克里格house 600have。六个小时对吧,那这个咱们也不用看了,那其他的这两个机域内存呢,还是比较均衡和稳定的,对不对,都是200左右,那Spark circle呢,可能有其他原因,那可能时间会多一点,Click house很明显是比这两个。多多了呀。是吧,那其实你可以对比一下单表。从psal跟impala来讲。他们的单表也好,多表关联也好,时间跟性能上差不多,都比较稳定,呃,那click house这个就很明显了,单表的时候不到100,才85。
23:06
那多表关联。直接飙到了600。对吧,他不太不是很擅长。所以呢,咱们在未来对click house使用的时候,架构上设计的时候,你就要考虑到了,呃,就咱们前前面提到为什么是和宽表呢?因为宽表是不是都是join完了,你的事实表也好,你的维度表也好,是不是都已经该关联,都关联好了之后才存入了一个click house,那后续呢,你对宽表无非就是做一些查询,聚合统计。对吧,也很少会涉及到join啊,所以这是咱们架构上的一个考虑啊,那我可以简单聊一聊,为什么click house做join不快,其实呢,很简单,呃,它是a join b,我简单聊一聊啊,简单提一嘴就好了,呃,比如说两张表做交易,它是什么呢?它会把右边这张表加载到内存。
24:08
然后呢?再一条一条去匹配。它可不管什么大小表啊,它的实现原理就是这样,把右表加载到内存,当然这还是单机的场景下,你想如果是分布式呢,一张表我存在多个节点,这种情况呢。那你这个资源的消耗跟效率就怎么样,特别低了啊,这个咱们到高级部分再去聊啊。好,这是它的一个几个特点,那相信介绍完之后呢。大家应该留下一个印象了吧,Click house,还有说咱们在使用上、架构上怎么来考虑啊,这是一个介绍。
我来说两句