clickhouse

原来你以为的风平浪静其实都是在蓄势待发

好久不用clickhouse,本来以为公司不用了,结果这几天统计数据载在这上面了,再查clickhouse发现版面都变了了,加油吧,话说clickhouse真的是很强大

再次出发,肯定要来点不一样的

列式存储

同一列中的数据属于同一类型,压缩效果显著,data size更小从磁盘读取更快

不同类型可选择不同压缩算法,高压缩比内存放更多数据,系统cache效果佳

稀疏索引

clickhouse支持对任意列创建任意数量的稀疏索引

本质上是对一个ndex granularity行数据的统计信息,不会记录每行的位置

类型

  • minmax:以index granularity为单位,储存指定表达式计算后的min、max值,查询中跳过不满足条件的块,减少IO
  • set(max_rows)以index granularity为单位,储存指定表达式的distinct value集合,快速判断等值查询是否命中该块,减少IO
  • ngrambf_v1(n,size_of_bloom_filter_in_bytes,number_of_hash_functions,random_seed)将string进行ngram分词构建bloom filter,优化等值、like、in等查询条件
  • tokenbf_v1(size_of_bloom_filter_in_bytes,number_of_hash_functions,random_seed)与上类似,不适应ngram分词通过标点符号词语分割
  • bloom_filter([false_positivel])对指定列构建bloom filter,加速等值、like、in查询

引擎是一大利器

     常用的有log、还有mergeTree,mergeTree支持主键 要求有日期字段

         ENGINE = MergeTree(create_date, (state_province), 8192);数字是index granularity 索引粒度默认即8192,数据由多组按主键进行字典序排列的part文件组成;主键的数据结构:每列数据按index granularity划分,划分后每block第一行成为mark行,主键索引储存mark行对应的主键值

     where中含主键查询,通过主键二分查找定位到index granularity

     还是有些迷糊,在表的分区中包括校验值、列名、列.mrk、列.bin、主键

某主键counterID,Date储存示意图:

主键不是唯一,可以插入主键相同的数据行

mergeTree

支持一个日期和一组主键的两层式索引,可实时更新数据

结合上下文看看一个简明的例子:ClickHouse 使用_clickhouse string没有指定默认值 他的默认值-CSDN博客

修改

写能力

采用LSM Tree结构:the log structured merge -tree,key-value储存系统,利用磁盘顺序写,关于LSM TreeLSM-tree 基本原理及应用 - 简书这里有比较简明的介绍,分层读写,key-value顺序执行

删除、更新通过支持mutation来实现alter table delete where filter_expr,alter table update col=val where filter_expr

计算

数据划分为多个partition,每个partition进一步划分为多个index granularity,多个CPU分别处理实现并行数据处理

可线性拓展分布式计算能力,将查询拆解为多个task下发到集群中,多机并行处理

  多副本时多种查询下发策略:

  •   随机下发,多个replica随机选择
  •   最近hostname,最近的节点,可降低网络延时,确保query下发到固定的replica机器,利用系统cache
  •   in order按照特定顺序逐个尝试下发,第一个不可用顺延下一个
  •   first or random 第一个不可用随机选择一个保证其余副本间负载均衡,在跨region复制场景下通过设置第一个replica为本region内副本,降低网络时延

动态代码生成runtime codegen

expression级别的runtime codegen,据当前sql直接生成代码编译执行,消除了虚函数调用(如图function pointer调用)运行时表达式的参数类型、个数已知,消除if-else判断

SIMD single instruction multiple date

     单指令多数据流,采用一个控制器来控制多个处理器:对同一组数据中每一个分别执行相同的操作实现空间并行性

      ck大量并行计算单机性能,通过列式存储查询时map化,每列操作向量化(增加并发)单机效率极高 

mergeTree

sql优化

1、分区:常一起用到的数据放到相同区

2、主键order by字段:where里肯定有的字段加到里面且放到第一位

索引优化

1、索引结构是稀疏索引,开始字段应该是区分度中等的字段

      区分度很高字段是索引一部分时用字段定位区间是全部数据,全部数据加载到内存再找符合条件的记录,慢;无该索引先用字段匹配仅读取一列

clickhouse的索引结构和查询优化_clickhouse 查询慢-CSDN博客

分片

clickhouse也支持分布式,将数据分为多个分片且分布到不同节点,不同分配策略在不同sql pattern时各有优势

  • random写入数据被随机分发到分布式集群中的某个节点
  • constant写入数据分发到固定的一个节点上
  • column value按某一列的值hash分片
  • 自定义表达式:据表达式(任意合法的)被计算后的值进行hash分片

hash分片join计算能避免数据shuffle在本地local join

以下是某大厂使用探索,谢谢分享携程用ClickHouse轻松玩转每天十亿级数据更新_DataX

1、join会那右表中的每一条数据到左表查找是否改记录存在,所以将小表放到右边

      不存在右表相应字段返回该字段类型的默认值,拒绝这种处理方式可添加join_use_nulls配置

2、通过jdbc批量写入数据时,控制每批次的数据中涉及到的分区数量

      写入前通过order by排序:无序数据可能涉及过多分区导致无法及时合并新数据、影响查询性能

      避免使用分布式表(性能不高),建表时分区字段不宜过多(否则易打满磁盘)

3、关注CPU,注意查询超时情况,设置报警

集群分片副本Clickhouse集群应用、分片、复制_httphandler: code: 279, e.displaytext() = db::nete-CSDN博客很详细了

查询语句

1 [with expr_list | (subquery)]
select [distinct] expr_list
3 [from [db.]table | (subquery) | table_function ] [final]
[sample sample_coeff]
5 [array join ……]
[global] [any|all] [inner | left  |right|full|cross] [outer] join  (subquery) |table using columns_list
7 [prewhere expr]
8 [where expr]
[group by expr_list] [with totals]
10 [having expr]
[order by expr_list] 
12 [limit [offset_value,] n By columns]
[limit [n,]m]
14 [union all ……】
[into outfile filename]
16 [format format]

[]标识可选择性使用
第一行查询可以被第二行使用
第二行过于基础、略
第4行只能在mergetree家族中使用且表创建时指定,抽样,抽取部分推出全局

SELECT <expr_list>
FROM <left_table>
[GLOBAL] [ANY|ALL|ASOF] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI] JOIN <right_table>
(ON <expr_list>)|(USING <column_list>) ...

注意哦left|right join 是不行的哦弟弟妹妹们



https://blog.csdn.net/HappyRocking/article/details/79885071?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase这个虽然是hive的但是可以有些启发
https://blog.csdn.net/qq_21125183/article/details/92683192 这个spark写的不错图文并茂

https://zhuanlan.zhihu.com/p/98135840

ClickHouse 架构概述 | ClickHouse Docs

https://blog.csdn.net/bluetjs/category_7664682.html

https://blog.csdn.net/u013007900/category_9271511.html

干货 | 每天十亿级数据更新,秒出查询结果,ClickHouse在携程酒店的应用_clickhouse 亿级 group by-CSDN博客

用户画像作为大数据的根基,它抽象出一个用户的信息全貌,为进一步精准、快速地分析用户行为习惯、消费习惯等重要信息,提供了足够的数据基础,奠定了大数据时代的基石。 用户画像,即用户信息标签化,就是企业通过收集与分析消费者社会属性、生活习惯、消费行为等主要信息的数据之后,抽象出一个用户的商业全貌作是企业应用大数据技术的基本方式。用户画像为企业提供了足够的信息基础,能够帮助企业快速找到精准用户群体以及用户需求等更为广泛的反馈信息。 用户画像系统能很好地帮助企业分析用户的行为与消费习惯,可以预测商品的发展的趋势,提高产品质量,同时提高用户满意度。构建一个用户画像,包括数据源端数据收集、数据预处理、行为建模、构建用户画像。有些标签是可以直接获取到的,有些标签需要通过数据挖掘分析到!本套课程会带着你一步一步的实现用户画像案例,掌握了本套课程内容,可以让你感受到Flink+ClickHouse技术架构的强大和大数据应用的广泛性。 在这个数据爆发的时代,像大型电商的数据量达到百亿级别,我们往往无法对海量的明细数据做进一步层次的预聚合,大量的业务数据都是好几亿数据关联,并且我们需要聚合结果能在秒级返回。 包括我们的画像数据,也是有这方便的需求,那怎么才能达到秒级返回呢?ClickHouse正好满足我们的需求,它是非常的强大的。 本课程采用Flink+ClickHouse技术架构实现我们的画像系统,通过学习完本课程可以节省你摸索的时间,节省企业成本,提高企业开发效率。希望本课程对一些企业开发人员和对新技术栈有兴趣的伙伴有所帮助,如对我录制的教程内容有建议请及时交流。项目中采用到的算法包含Logistic Regression、Kmeans、TF-IDF等,Flink暂时支持的算法比较少,对于以上算法,本课程将带大家用Flink实现,并且结合真实场景,学完即用。系统包含所有终端的数据(移动端、PC端、小程序端),支持亿级数据量的分析和查询,并且是实时和近实时的对用户进行画像计算。本课程包含的画像指标包含:概况趋势,基础属性,行为特征,兴趣爱好,风险特征,消费特征,营销敏感度,用户标签信息,用户群里,商品关键字等几大指标模块,每个指标都会带大家实现。课程所涵盖的知识点包括:开发工具为:IDEA FlinkClickhouseHadoopHbaseKafkaCanalbinlogSpringBootSpringCloudHDFSVue.jsNode.jsElemntUIEcharts等等 课程亮点: 1.企业级实战、真实工业界产品 2.ClickHouse高性能列式存储数据库 3.提供原始日志数据进行效果检测 4.Flink join企业级实战演练 5.第四代计算引擎Flink+ClickHouse技术架构6.微服务架构技术SpringBoot+SpringCloud技术架构7.算法处理包含Logistic Regression、Kmeans、TF-IDF等8.数据库实时同步落地方案实操9.统计终端的数据(移动端、PC端、小程序端) 10.支撑亿级海量数据的用户画像平台11.实时和近实时的对用户进行画像计算12.后端+大数据技术栈+前端可视化13.提供技术落地指导支持 14.课程凝聚讲师多年实战经验,经验直接复制15.掌握全部内容能独立进行大数据用户平台的设计和实操企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值