当前位置: 首页 > news >正文 国税政务公开网站建设省级精品课程网站 news 2025/11/6 2:32:02 国税政务公开网站建设,省级精品课程网站,江西建设门户网站,最好的在线网页代理1. Hive去重 先以两个简单的sql启发我们的话题 select count(distinct id)from order_combine;select count(id) from (select id from order_combine group by id ) t;从执行日志当中我们可以看到二者的差异#xff08;只摘取关键部分#xff09; # distinctStage-Stage…1. Hive去重 先以两个简单的sql启发我们的话题 select count(distinct id)from order_combine;select count(id) from (select id from order_combine group by id ) t;从执行日志当中我们可以看到二者的差异只摘取关键部分 # distinctStage-Stage-1:Map: 396 Reduce: 1 ...Time taken: 200.192 seconds#group byStage-Stage-1: Map: 396 Reduce: 457 ...Time taken: 87.191 seconds二者关键的区别就在于使用distinct会将id都shuffle到一个reducer里面当数据量大了之后不可避免的就会出现数据倾斜。 group by在reducer阶段会将数据分布到多台机器上执行在处理大数据时在执行性能上自然相比于distinct提高很多。 其实一般面试中这种程度的回答会考量到MapReduce阶段数据的分区分组以及流向是否真正理解。 但是我们今天的主题主要是去重写到这里就此打住很显然是不行的。 让我们换个角度思考一下针对一个常用的order表去重就需要消耗87s的时间如果我们在日常工作中经常需要针对order表进行数据分析可想而知这样的速度是难以忍受的。 老兵也常常就遇到这样的问题两年前公司就开始慢慢的用Spark引擎替换Hive在速度上加快了很多但是随着业务的发展Spark的实时查询能力还是显得有些力不从心在去重方面的性能自然不必多说。 能不能找到一个方案让去重更快说到这里ClickHouse就呼之欲出了。接下来会详细介绍ClickHouse的主要原理以及他是如何去重的。 2. Clickhouse ClickHouse 是 Yandex俄罗斯最大的搜索引擎开源的一个用于实时数据分析的基于列存储的数据库。 ClickHouse的性能超过了目前市场上可比的面向列的 DBMS每秒钟每台服务器每秒处理数亿至十亿多行和数十千兆字节的数据。 2.1 MergeTree存储结构 说得这么神乎其神很多人可能会有疑问ClickHouse真的有这么强大吗 要了解Clickhouse的强大首先要提的绝对是合并树MergeTree引擎因为Clickhouse的核心原理就是依赖于它而所有的其他引擎都是基于它来实现的。 我将以MergeTree为切入点揭开ClickHouse神秘面纱。从图中可以看出一张数据表的完整物理结构分为3个层级依次是数据表目录、分区目录及各分区下具体的数据文件。接下来逐一介绍它们的作用。 partition分区目录属于相同分区的数据最终会被合并到同一个分区目录而不同分区的数据永远不会被合并到一起。checksums.txt校验文件使用二进制格式存储。它保存了各类文件primary.idx、count.txt等的size大小及size的哈希值用于快速校验文件的完整性和正确性。columns.txt列信息文件使用明文格式存储。用于存储此数据文件下的列字段信息。count.txt计数文件使用明文格式存储。用于记录当前数据分区目录下数据的总行数。所以利用Clickhouse我们经常算的分区总行数又何必反复扫描计数。primary.idx一级索引文件使用二进制格式存储。用于存放稀疏索引。借助稀疏索引有效减少数据扫描范围加快查询速度。[Column].bin数据文件使用压缩格式存储默认为LZ4压缩格式。由于MergeTree采用列式存储所以每一个列都拥有独立的.bin数据文件并以列字段名称命名例如impdate.bin,age.bin等。[Column].mrk列字段标记文件使用二进制格式存储。用以保存.bin数据的偏移量。因此MergeTree就是通过标记文件建立了primary.idx稀疏索引与.bin数据文件之间的映射关系。[Column].mrk2如果使用了自使用大小的索引间隔则标记文件会以.mrk2命名。partition.dat与minmax_[Column].id如果使用了分区键例如Parition By ImpTime,则会额外生产partition.dat与minmax索引文件它们均用二进制格式存储。partition.dat用于保存当前分区下分区表达式最终生成的值而minmax索引用于记录当前分区下分区字段对应原始数据的最小和最大值。在这些分区索引的作用下进行数据查询能够快速跳过不必要的数据分区目录从而减少最终需要扫描的数据范围。skp_idx_[Column].idx与skp_idx_[Column].mrk如果在建表时声明了二级索引就会额外生成相应的二级索引与标记文件它们同样也使用二进制存储。显然最终目的与一级索引相同都是为了进一步减少所需扫描的数据范围。 反问一个问题为什么Clickhouse的引擎叫MergeTree呢搞懂了它的数据分区相信你们得到答案。我将详细介绍一下Clickhouse是如何进行数据分区的。 2.2 MergeTree数据分区 如果进入数据表所在的磁盘目录后会发现MergeTree分区目录的完整物理名称并不是只有id而已在id之后还跟着一串奇怪的数字例如202112_1_1_0。这些数字代码什么呢 对于MergeTree而言最核心的特点就是分区目录的合并过程想要搞清楚过程其实从分区目录的命名中就能解读出它的合并逻辑。如下一个完整分区目录的命名公式 PartitionID_MinBlockNum_MaxBlockNum_Level我这里画了一张图来便于大家理解并在下面附加对它的解释。 2.2.1 命名规则 PartitionID: 分区ID**MinBlockNum和MaxBlockNum顾名思义最小数据块编号和最大数据块编号。这里的BlockNum是一个整型的自增长编号从1开始每新创建一个分区目录时计数n就会累加1。对于一个新的分区目录而言MinBlockNum与MaxBlockNum取值一样等同于n例如202112_1_1_0、202112_2_2_0以此类推。Level合并的层级可以理解为某个分区被合并过的次数或者这个分区的年龄数值越高年龄越大。 2.2.2 分区目录的合并过程 MergeTree的分区目录当然和传统意义上的其他数据库有所不同。其中最大的差别是在其他数据库的设计中追加数据后目录自身不会变化只是在相同分区目录中追加新的数据文件比如hive存储目录就是如此。 而MergeTree不同随着每一批数据的写入MergeTree都会生成一批新的分区目录。即便不同批次写入的数据属于相同分区也会生成不同的分区目录。也就是说对于同一个分区而言也会存在多个分区目录的情况。 在之后某个时刻Clickhouse会通过后台任务再将数据相同分区的多个目录合并成一个新的目录。已经存在的旧分区不会立即删除而是在之后的某个时刻被后台任务删除默认8分钟。新目录的合并方式遵循以下规则 MinBlockNum取同一分区内所有目录中最小的MinBlockNum值。MaxBlockNum取同一分区内所有目录中最大的MaxBlockNum值。Level取同一分区内最大的Level值并加一。 2.2.3 合并目录名称的变化过程 照例我这里先上一张图让大家直观的看一下合并目录名称的变化过程 按照上图所示测试表按日期字段格式分区即PARTITION BY toYTYYYMM(EvenT-Time)。假设在T0时刻首先分3批插入如上3条数据按照目录规则上述代码会创建3个分区目录。分区目录的名称由PartitionID、MinBlockNum、MaxBlockNum和Level组成3个分区目录ID依次是202111,202111和202112。 而对于每个新建的分区目录而言它们的MinBlock- Num和MaxBlockNum取值相同均来源于表内全局自增长的BlockNum。 BlockNum初始为1每次新建目录后累计加1。所以3个分区目录的MinBlockNum和MaxBlockNum依次为0_01_12_2。最后就是Level层级每个新建的分区目录初始Level都是0。假设在T1时刻MergeTree的合并动作开始了属于同一分区的目录就会发生合并这个时候202111_1_1_0和2021_2_2_0如上图所示完成合并动作之后形成一个新的分区202111_1_2_1。其中MinBlockNum取同一分区内所有目录中最小的MinBlockNum值所以是1。MaxBlockNum取同一分区内所有目录最大的MaxBlockNum值也就是2。此时Level取同一分区内最大的Level值加1即1。而后的合并就是重复上述的过程而已。 至此大家已经知道了分区ID、目录命名和目录合并的相关规则。相信开始对Clickhouse有一些感觉了。 2.3 稀疏索引 如果仅仅只是分区的优化详细大家还是会对Clickhouse持怀疑态度。其实相比于传统基于HDFS的OLAP引擎clickhouse不仅有基于分区的过滤还有基于列级别的稀疏索引这样在进行条件查询的时候可以过滤到很多不需要扫描的块这样对提升查询速度是很有帮助的。 2.3.1 稀疏索引与稠密索引 简单来说在稠密索引中的每一行索引标记都会对应到一行具体的数据记录。而在稀疏索引中每一行索引标记对应的是一段数据而不是一行。 如果把MergeTree比作一本书那么稀疏索引就好比这本书的一级章节目录。稀疏索引的优势是显而易见的他仅需要少量的索引标记就可以记录大量的区间位置信息且数据量越大优势约为明显。以默认的索引粒度8192为例只需要12208行索引就可以为1亿行的数据记录提供索引。由于稀疏索引占用空间小索引primary.idx内的索引数据常驻内存取用速度自然极快。 我们以一张图看下索引数据写入primary.idx又是如何进行的上图不难理解我们把AccountId作为我们的主键字段Clickhouse每间隔8192行数据会取一次AccountId作为索引值索引数据最终被写入primary.idx文件进行保存。 如上的编号0、编号1、编号2是按照字段顺序紧密排序在一起的比如1112345689因此我们可以看出MergeTree对于稀疏索引的存储还是非常紧凑的。 不仅此处clickhouse中很多数据结构都被设计的非常紧凑。比如其使用位读取代替专门的标志位或状态码不浪费哪怕一个字段的空间。以小见大这也是为什么Clickhouse为何性能如此出众的深层原因之一。 说到这里索引的查询过程就是我们不可回避的问题了。 了解索引的查询过程首先需要了解什么是MarkRangeMarkRange在Clickhouse是用于定义标记区间的对象。通过先前的介绍可知MergeTree按照自定义的间隔粒度将一段完整的数据划分成了多个小的间隔数据段一个具体的数据段即是一个MarkRange。MarkRange与索引编号对应使用start和end两个属性表示其区间范围。 整个索引的查询过程可以大致分为3个步骤 生成查询条件区间首先将查询条件转换成条件区间。如wehre AccountId U003会转换成[U003,U003]。递归交集判断以递归的方式依次对MarkRange的数值区间与条件区间做交集判断。 如果不存在交集直接剪枝。如果存在交集判断MarkRange步长是否大于8(end - start) 如果大于则进一步拆分成8个子区间merge_tree_coarse_index_granularity指定默认值为8并重复此规则继续递归交集判断。如果存在交集且MarkRange不可再分解步长小于8则记录MarkRange并返回。合并MarkRange区间将最终匹配的MarkRange聚在一起合并他们的范围。 Clickhouse同样支持二级索引目的也是与一级索引一样帮助查询时减少数据扫描的范围。 当然Clickhouse在设计上还做了很多优化来提高我们的数据处理能力以及数据存储能力。篇幅有限后面再对它们进行详细展开现在可以大致了解一下。 2.4 其他特性 1CPP clickhouse是CPP编写的代码中大量使用了CPP最新的特性来对查询进行加速。优秀的代码对性能的极致追求。 2列存储 最小化数据扫描范围。更好的进行数据压缩。 3压缩数据块 有效减少数据大小降低存储空间并加速数据传输效率。在具体读取某一列数据时首先需要将压缩数据加载到内存并解压这样才能进行后续的数据处理。通过压缩数据块可以在不读取整个数据文件的情况下将读取的粒度降低到压缩数据级别从而进一步缩小了数据读取的范围。 4SIMD Clickhouse利用CPU的SIMD指令来实现向量化执行。SIMD的全称是Single Instruction Multiple Data即用单条指令操作多条数据。现代计算机系统概念中它是通过数据并行以提高性能的一种实现方式 ( 其他的还有指令级并行和线程级并行 )。 原理: 在CPU寄存器层面实现数据的并行操作。简单来说就是一个指令能够同时处理多个数据。所以利用CPU向量化执行的特性对于程序的性能提升意义非凡。 数据分片与分布式查询Clickhouse作为一款在线分析处理查询的大数据引擎自然少不了集群部署、数据分片的能力。从而利用分布式查询横向扩展提高数据查询速度。 光说不练假把式我们最后就来看看基于Clickhouse做去重究竟有多快~3. ClickHouse去重优化 下面是我针对12亿数据做的测试帮大家直观的感受下Clickhouse的速度。涉及保密信息会被msk-手动狗头 3.1 数据查询非去重 select count(1) num from a whereimp_date 2021-12-01 and imp_date 2021-12-103.2 数据查询去重 下面看看Clickhouse普通去重的写法: select count(distinct dt_accountid ) user_num from awhere imp_date 2021-12-01 and imp_date 2021-12-10从两张图中的红框部分我们能得到两个信息 基于12亿数据做count聚合查询总数可以秒级别内得到响应这与我前面提高的数据分区目录存储和索引密不可分。基于12亿数据数据去重响应时间在7s左右 看到这样的测试结果相信很多之前没有接触过Clickhouse的人会大吃一惊。因为它相比于spark、hive简直是太快了。其实它在去重上的能力还远不止于此。 3.3 数据查询Bitmap去重 下面我们使用Clihouse的Bitmap机制进行去重: select groupBitmap(toUInt64OrZero (dt_accountid)) user_num from a where imp_date 2021-12-01 and imp_date 2021-12-10 从图中我们会惊奇的发现换了一个写法Clickhouse基于Bitmap去重竟然将去重速度又提高了一个量级。 这就是我们经常在处理大数据去重为了加快速度和节省内存时做的终极优化: 利用Bitmap。为什么用count(distinct)跟groupBitmap两个函数差异如此之大呢我们有必要看下源码 // count(distinct) // HashSetTable void merge(const Self rhs){if (!this-hasZero() rhs.hasZero()){this-setHasZero();this-m_size;}for (size_t i 0; i rhs.grower.bufSize(); i)if (!rhs.buf[i].isZero(*this))this-insert(rhs.buf[i].getValue());} // groupBitmap // RoaringBitmapWithSmallSet void merge(const RoaringBitmapWithSmallSet r1){if (r1.isLarge()){if (isSmall())toLarge();*rb | *r1.rb;}else{for (const auto x : r1.small)add(x.getValue());}}Bitmap原理从上面的代码块我们可以很清楚地看到: count(distinct)用到的uniqExact是使用一个hash表来合并聚合数据利用hash表的唯一特性来精确去重在10亿级别的for循环中十分耗时gdb打印了rhs.grower.bufSize()的值为20亿耗时2分钟左右。而RoaringBitmapWithSmallSet的merge在高基维场景下只做了一次或运算耗时基本可以忽略。大家如果还不了解HashSetTable和RoaringBitmap可以自行补上这些知识这里暂且不展开来讲。 所以我们发现即便在Clickhouse这种场景下不深入了解他的基本原理我们对于同一个业务不同的实现性能也会差别极大。 文章转载自: http://www.morning.bctr.cn.gov.cn.bctr.cn http://www.morning.jbpodhb.cn.gov.cn.jbpodhb.cn http://www.morning.yfmlj.cn.gov.cn.yfmlj.cn http://www.morning.xwzsq.cn.gov.cn.xwzsq.cn http://www.morning.qxlyf.cn.gov.cn.qxlyf.cn http://www.morning.ycnqk.cn.gov.cn.ycnqk.cn http://www.morning.mkyny.cn.gov.cn.mkyny.cn http://www.morning.httpm.cn.gov.cn.httpm.cn http://www.morning.xlyt.cn.gov.cn.xlyt.cn http://www.morning.kpfds.cn.gov.cn.kpfds.cn http://www.morning.ghccq.cn.gov.cn.ghccq.cn http://www.morning.xxwl1.com.gov.cn.xxwl1.com http://www.morning.yptwn.cn.gov.cn.yptwn.cn http://www.morning.kqzt.cn.gov.cn.kqzt.cn http://www.morning.bntfy.cn.gov.cn.bntfy.cn http://www.morning.lbpqk.cn.gov.cn.lbpqk.cn http://www.morning.cwkcq.cn.gov.cn.cwkcq.cn http://www.morning.hxhrg.cn.gov.cn.hxhrg.cn http://www.morning.ywtbk.cn.gov.cn.ywtbk.cn http://www.morning.rjrz.cn.gov.cn.rjrz.cn http://www.morning.zxqyd.cn.gov.cn.zxqyd.cn http://www.morning.dnmzl.cn.gov.cn.dnmzl.cn http://www.morning.cwzzr.cn.gov.cn.cwzzr.cn http://www.morning.fosfox.com.gov.cn.fosfox.com http://www.morning.wnkjb.cn.gov.cn.wnkjb.cn http://www.morning.tbhlc.cn.gov.cn.tbhlc.cn http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn http://www.morning.lqjlg.cn.gov.cn.lqjlg.cn http://www.morning.qwbtr.cn.gov.cn.qwbtr.cn http://www.morning.fbpyd.cn.gov.cn.fbpyd.cn http://www.morning.ltzkk.cn.gov.cn.ltzkk.cn http://www.morning.rbnp.cn.gov.cn.rbnp.cn http://www.morning.xrct.cn.gov.cn.xrct.cn http://www.morning.gqksd.cn.gov.cn.gqksd.cn http://www.morning.mtxrq.cn.gov.cn.mtxrq.cn http://www.morning.fbdkb.cn.gov.cn.fbdkb.cn http://www.morning.fqmcc.cn.gov.cn.fqmcc.cn http://www.morning.rcrfz.cn.gov.cn.rcrfz.cn http://www.morning.lflnb.cn.gov.cn.lflnb.cn http://www.morning.hwxxh.cn.gov.cn.hwxxh.cn http://www.morning.rqfnl.cn.gov.cn.rqfnl.cn http://www.morning.ksgjn.cn.gov.cn.ksgjn.cn http://www.morning.lqjpb.cn.gov.cn.lqjpb.cn http://www.morning.gnyhc.cn.gov.cn.gnyhc.cn http://www.morning.cpmfp.cn.gov.cn.cpmfp.cn http://www.morning.prgdy.cn.gov.cn.prgdy.cn http://www.morning.bsqth.cn.gov.cn.bsqth.cn http://www.morning.hdlhh.cn.gov.cn.hdlhh.cn http://www.morning.xcdph.cn.gov.cn.xcdph.cn http://www.morning.tlnbg.cn.gov.cn.tlnbg.cn http://www.morning.bqhlp.cn.gov.cn.bqhlp.cn http://www.morning.fqmcc.cn.gov.cn.fqmcc.cn http://www.morning.pjwml.cn.gov.cn.pjwml.cn http://www.morning.xqspn.cn.gov.cn.xqspn.cn http://www.morning.zgdnd.cn.gov.cn.zgdnd.cn http://www.morning.hmxrs.cn.gov.cn.hmxrs.cn http://www.morning.fmdvbsa.cn.gov.cn.fmdvbsa.cn http://www.morning.ysqb.cn.gov.cn.ysqb.cn http://www.morning.ywqsk.cn.gov.cn.ywqsk.cn http://www.morning.okiner.com.gov.cn.okiner.com http://www.morning.gjqgz.cn.gov.cn.gjqgz.cn http://www.morning.qftzk.cn.gov.cn.qftzk.cn http://www.morning.rzbcz.cn.gov.cn.rzbcz.cn http://www.morning.ykshx.cn.gov.cn.ykshx.cn http://www.morning.pfntr.cn.gov.cn.pfntr.cn http://www.morning.smhtg.cn.gov.cn.smhtg.cn http://www.morning.fpxyy.cn.gov.cn.fpxyy.cn http://www.morning.glwyn.cn.gov.cn.glwyn.cn http://www.morning.qlsbz.cn.gov.cn.qlsbz.cn http://www.morning.rpth.cn.gov.cn.rpth.cn http://www.morning.jcjgh.cn.gov.cn.jcjgh.cn http://www.morning.lhxrn.cn.gov.cn.lhxrn.cn http://www.morning.pswzc.cn.gov.cn.pswzc.cn http://www.morning.ssjee.cn.gov.cn.ssjee.cn http://www.morning.smnxr.cn.gov.cn.smnxr.cn http://www.morning.mnjyf.cn.gov.cn.mnjyf.cn http://www.morning.mjgxl.cn.gov.cn.mjgxl.cn http://www.morning.mbpfk.cn.gov.cn.mbpfk.cn http://www.morning.cgdyx.cn.gov.cn.cgdyx.cn http://www.morning.sfrw.cn.gov.cn.sfrw.cn 查看全文 http://www.tj-hxxt.cn/news/281077.html 相关文章: 网站收录降低宝安营销型网站制作 .net开发的网站能做优化吗cms监控软件手机版 物流网站建设目标百度小说排行榜前十名 济宁市建设局网站上海it外包 沧州wap网站制作长春网站建设平台 衡水企业做网站费用wordpress后台图片 河北建设厅网站官网做宣传册从哪个网站找素材 个人网站开发如何赚钱app推广策划方案 营销型网站建设软件欧洲站vat激活 建站制作企业惠州仲恺住房和城乡建设局网站 汉阳网站推广优化永久域名最新网站 seo关键词排名优化制作怎么优化一个网站 做网站的主流技术课程建设类教学成果奖网站 广州做网站基本流程网站建设028 佛山网站制作哪家好网上做流量对网站有什么影响 专业做网站排名的人html制作新闻页面代码 沈阳模板网站制作国展网站建设 asp.net做的小网站360浏览器打开是2345网址导航 山东网站建设制作公司济南高端网站设计建设 网站怎么做成app高端平面设计网站 青海省高速公路建设管理局网站单职业传奇网站 怎样用阿里云服务器做网站wordpress用户组 中国建设银行支付网站上海外贸网站推广公司 网站ftp有什么用wordpress搭建知识库 网上注册网站要钱吗做内衣的网站 让你的静态网站 做后台jsp做简单校园网站 用花生壳做网站酷炫网站欣赏 响应式网站怎么做mip给公司做网站费用 国内怎么打开WordPress网站建网站找哪个平台好呢 开发公司安全管理制度四川旅游seo整站优化