记录一下亿级别数据入库clickhouse

需求背景

公司的业务主要是广告数据归因的,每天的pv数据和加粉数据粗粗算一下,一天几千万上亿是有的。由于数据量大,客户在后台查询时间跨度比较大的数据时,查询效率就堪忧。因而将数据聚合后导到clickhouse进行存储,目的只有一个就是加快查询,提高用户体验感。原本以为是个简单的需求,但是在中途还是遇到一些坑。在这里做一个简单的思路分享,后面工作久一些的铁子们应该用的上。

clickhouse文档

文档地址

经验小结第一点

由于清洗历史数据的前期,可能会遇到统计错误,这就涉及到重复清洗的问题。既然需要重复清洗,那么历史数据就需要先删除。在clickhouse的官方文档中,是没有delete的语句的,他的删除语句其实有点像更新语句,严谨来说删除操作其实也是更新的一种。他的SQL语句如下:

 ALTER TABLE 表名 DELETE WHERE + 条件

注意: clickhouse的删除操作不是同步的,而是异步的,并且时间不确定。就是说你在发送这条指令之后,如果后面立即进行新数据的插入,那么大概率的情况下会出现数据错误或者不一致的问题,我分析了一下,当我插入相同时间段的历史数据的时候,这个删除的指令有可能在删除我后面插入的数据,这里是一个大坑,切记!切记!切记!

那么怎么解决呢,如果你的数据比较少或者一天就聚合一两次,那你可以先执行删除的操作,隔一段时间后,再去执行插入的操作,虽然官方文档解释,异步执行的时间不确定,但是只有你在流量比较小的时候去执行,一般没什么问题。

经验小结第二点

因为clickhouse的设计机制中涉及分区的概念,简单理解就是,类似按一定维度去分表,比如按月份分别这种,既然分区,那就涉及到合并数据。在我们日常业务中,由于不可控的因素,偶发性其实出现重复数据是比较常见的问题。但也是一个比较令人痛疼的问题。

考虑到clickhouse删除数据的异步性,加上广告业务,面向B端的客户,数据的实时性也是比较重要的。所以用删除语句去删除再插入,显得就有点不靠谱了,所以下面就需要了解一下clickhouse集中常见的表引擎。

clickhouse官方文档介绍的几种表引擎


下面简单带一下其中的两种,不是说其他的不好,只是这两种我这次分析过,根据自己的业务需求去选择引擎就好。

CollapsingMergeTree

该引擎继承于 MergeTree,并在数据块合并算法中添加了折叠行的逻辑。

CollapsingMergeTree 会异步的删除(折叠)这些除了特定列 Sign 有 1 和 -1 的值以外,其余所有字段的值都相等的成对的行。没有成对的行会被保留。更多的细节请看本文的折叠部分。

因此,该引擎可以显著的降低存储量并提高 SELECT 查询效率。

他的建表语句如下:

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...
) ENGINE = CollapsingMergeTree(sign)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
CollapsingMergeTree 参数

sign — 类型列的名称: 1 是«状态»行,-1 是«取消»行。列数据类型 — Int8。

解释

这是什么意思呢,我解释一下,其实我个人感觉有点鸡肋,他的意思是你每次插入数据前,都需要插入两次,除了sign字段的值不一样,其他列数据都一样,这样,他在数据合并的过程中,带有-1标识的数据会跟之前的重复的历史数据相互抵消,只保留最新的这一条数据。这就是它处理重复数据的方法,官方的案例是这个样子的:


他这种在特性的场合是可以用的,比如某些数据状态需要经常性更新的时候,是可行的。

官方案例地址:案例地址

但是我没敢用,为什么?

假设我的表初始的时候,是空的,我压根就没有历史数据,那我的这两条数据是不是有可能会相互冲销掉。为此我特地查了一下,结果还真有这种可能性。OMG,算了,这个方式我还是不敢用,不然出问题直接卷铺盖走人。

最终采用的表引擎——ReplacingMergeTree表引擎

借用官方的解释:

该引擎和 MergeTree 的不同之处在于它会删除排序键值相同的重复项。

数据的去重只会在数据合并期间进行。合并会在后台一个不确定的时间进行,因此你无法预先作出计划。有一些数据可能仍未被处理。尽管你可以调用 OPTIMIZE 语句发起计划外的合并,但请不要依靠它,因为 OPTIMIZE 语句会引发对数据的大量读写。

因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空间,但是它不保证没有重复的数据出现。(这个后续有解决的方式)
这里说的出现重复的数据,其实也是因为它的合并时间是不确定的,不一定马上就合并,所以你查询的时候可能会看到一些重复数据,不过它又提供了一道生门,这个很重要,你可以使用FINAL这个关键字进行查询,SQL语句如下:

slecct * from 表名 [WHERE ...] final

这样查询的时候就是查询最后插入的这条数据。建表语句如下:

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...
) ENGINE = ReplacingMergeTree([ver])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

expr:这个可以理解成mysql的唯一索引,后面合并数据的时候,它也是以此为依据判断是否是重复数据
举个例子

CREATE TABLE IF NOT EXISTS landing_page_day_statistics
(advertiser_account_group_id               bigint comment '项目ID',landing_page_id                           bigint comment '落地页ID',statistic_date                            timestamp comment '统计日期',landing_page_channel_id                   bigint comment '渠道ID',page_view_num                             bigint default 0 comment '浏览数',created_at                                timestamp)ENGINE = ReplacingMergeTree() PARTITION BY toYYYYMM(statistic_date)PRIMARY KEY (advertiser_account_group_id, landing_page_id, landing_page_channel_id, statistic_date)ORDER BY (advertiser_account_group_id, landing_page_id, landing_page_channel_id, statistic_date)COMMENT '测试表';

那么在这个引擎下,它就以advertiser_account_group_id, landing_page_id, landing_page_channel_id, statistic_date为唯一键进行判断是否是重复数据,是重复的数据,后续合并的时候就会合并成一条数据。

总结

clickhouse是一个高性能的查询数据库,它的强项在于缩短查询时间,其实严格来说就是用空间换时间。他很强大,但是也需要注意使用的姿势。对于官方文档,一定要多看几遍,看懂了,其实坑就踩平了,当然还有很多其他需要注意的点,后续继续整理给大伙分享一下。

好了,今天的内容就分享到这里,更多内容整理在公众号”安前码后“,一个专注分享使用干货的号,另外最近团队在做"韭盾专栏"号,对财经感兴趣的可以先关注,文章也都是干货,一篇推文一般需要成员花一周的时间去整理和分析。题外话,觉得文章有点小作用,实用的话,帮忙给个三连,感激不尽。
加油,铁子们!!
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

32阵元 MVDR和DREC DOA估计波束方向图对比

32阵元 MVDR和DREC DOA估计波束方向图对比 一、原理 MVDR原理:https://zhuanlan.zhihu.com/p/457528114 DREC原理(无失真响应特征干扰相消器):http://radarst.ijournal.cn/html/2019/3/201903018.html 主要参数: 阵…

完全适配各类中小医院专科医院和诊所的云HIS系统源码【前端:Angular+Nginx ,后台:SpringBoot】

云HIS系统采用SaaS软件应用服务模式,提供软件应用服务多租户机制,实现一中心部署多机构使用。相对传统HIS单机构应用模式,它可灵活应对区域医疗、医疗集团、医联体、连锁诊所、单体医院等应用场景,并提升区域内应用的标准化与规范…

Java技术栈 —— Nginx的使用

Java技术栈 —— Nginx的使用 一、认识Nginx二、搭建Nginx环境2.1 在Ubuntu上安装Nginx 三、使用Nginx3.1 配置负载均衡(HTTP) 一、认识Nginx 企业需要运行多个相同的副本,并将负载分散在整个系统集群上,为了高性能的负载均衡,引入了Nginx代…

通过C++程序实现光驱的自动化刻录和读取

文章目录 ISO文件格式光盘的基本概念光盘种类特点DVDR光盘使用windows调用Linux调用Linux平台下用到的C库:读取设备驱动列表向光驱中写文件 数字存储媒体快速发展的今天,光驱的使用已经不像以前那样普及了。但是在数据备份、安装软件和操作系统、旧设备兼容等领域还…

PiflowX大数据流水线系统

PiflowX大数据流水线系统。支持分布式计算引擎flink和spark。以所见即所得的方式,实现大数据采集、处理、存储与分析流程化配置、运行与智能监控。 PiflowX基于Piflow(PiFlow: 混合型科学大数据流水线系统,包含丰富的处理器组件,…

算法导论复习(七) 动态规划

动态规划一般用来求解最优化问题 设计一个动态规划算法一般有以下四步: 描述一个最优解的结构特征。递归地定义最优解的值。计算最优解的值,通常采用自底向上的方法。利用计算出的信息构造出一个最优解。 钢条切割问题 体现了动态规划的一个重要性质&a…

k8s 网络

还没有部署网络。 k8s的网络类型: k8s中的通信模式: 1,pod内部之间容器和容器之间的通信。 在同一个pod中的容器共享资源和网络,使用同一个网络命名空间。可以直接通信的。 2,同一个node节点之内不同pod之间的通信。…

大创项目推荐 深度学习YOLO抽烟行为检测 - python opencv

文章目录 1 前言1 课题背景2 实现效果3 Yolov5算法3.1 简介3.2 相关技术 4 数据集处理及实验5 部分核心代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习YOLO抽烟行为检测 该项目较为新颖,适合作为竞赛课…

BAQ压缩MATLAB仿真

本专栏目录: ​​​​​​​全球SAR卫星大盘点与回波数据处理专栏目录-CSDN博客 我们按照上一期文章的BAQ原理编写MATLAB代码,进行baq压缩与解压缩的全流程验证,并分析BAQ压缩对信号指标造成的影响。 生成3个点目标回波数据,加入高斯噪声,对回波进行BAQ压缩和解BAQ压缩,…

具有出色的数据速率、SI8642BA-AUR、SI8642BB-AS1R、SI8641BB-B-IUR、SI8635BD-B-ISR低功耗数字隔离器

一、简介 Si86xx 超低功耗数字隔离器系列是CMOS器件,与传统隔离技术相比,具有出色的数据速率、传播延迟、功耗、尺寸、可靠性和外部BOM优势。这些产品的工作参数在宽温度范围内和整个设备使用寿命内保持稳定,便于设计和高度统一的性能。所有…

java毕业设计—基于SpringBoot的小米商城的设计与实现

1,绪论 1.1 背景调研 电子商城的建设,不仅仅是初级网上购物的实现,它能够有效地在Internet上构架安全的和易于扩展的业务框架体系,实现BToB(企业对企业)、BToC(企业对用户)以及CTo…

首次使用TypeScript,报错:无法重新声明块级范围变量(声明变量报错)

前几天在书写TypeScript代码时,出现了声明变量报错的情况,具体情况如下: let arr: number; arr 10; console.log(arr);报错如下: 解决方案: 在配置文件tsconfig.json中,配置如下代码: { &q…

【计算机毕业设计】SSM医疗药品采购系统

项目介绍 ssm医疗药品采购系统。主要功能有: 用户管理:管理员列表; 采购管理:采购列表; 药品出库:药品出库; 库存管理:库存统计; 数据维护:药品列表、仓库…

软件测试常见的面试题,这些题面试前看提高百分之60的通过率

01、您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答:有黑盒和白盒两种测试种类,黑盒有等价类划分法,边界分析法,因果图法和错误猜测法。白盒有逻辑覆盖法&…

3D手势光流计算

GitHub - NVIDIA/flownet2-pytorch: Pytorch implementation of FlowNet 2.0: Evolution of Optical Flow Estimation with Deep Networks 计算光流 conda create -n 3dgesture python3.8 conda activate 3dgesture ​pip install torch 1. import torch时报错ModuleNotFoun…

从 Linux Crontab 到 K8s CronJob,定时任务正在经历怎样的变革

作者:黄晓萌(学仁) 背景 Job 表示短周期的作业,定时 Job 表示按照预定的时间运行Job,或者按照某一频率周期性的运行 Job。比如: 许多传统企业使用 Linux 自带的 crontab 来做定时任务的方案,该方案非常简单&#xff…

腾讯云服务器购买流程:一步步全流程购买指南

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算,在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵,但是自定义购买云服务器CPU内存带宽配置选择范围广,活动上购买只能选择固定的活动机,选择范围窄,但是…

Vue 问题解决

一、问题:TypeError: (0 , _message.default) is not a function 当没有default时,在其他页面import引入的时,必须加{}。 二、问题:Vue前端页面的表格数据总是一行一行的显示 使用Async/Await来解决前端数据一行一行显示的问题。可以将获取部…

鸿蒙原生应用再添新丁!搜狐集团、航旅纵横入局鸿蒙

鸿蒙原生应用再添新丁!搜狐集团、航旅纵横入局鸿蒙 来自 HarmonyOS 微博12月28日消息,搜狐集团宣布与华为达成全面合作!搜狐新闻近期将完成#鸿蒙原生应用#核心功能版本,搜狐视频也启动了#鸿蒙原生应用#开发!这不仅是一…

数据结构学习 Leetcode494 目标和

关键词:动态规划 01背包 dfs回溯 一个套路: 01背包:空间优化之后dp【target1】,遍历的时候要逆序遍历完全背包:空间优化之后dp【target1】,遍历的时候要正序遍历 题目: 解法一: …