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

基于springboot操作clickhouse进行大数据查询和批量插入 基于springboot完成clickhouse数据库操作,此为真实项目案例,各位可参考一二 阅读详情

作者简介

蔡岳毅,携程酒店大数据高级研发经理,负责酒店数据智能平台研发,大数据技术创新工作。喜欢探索研究大数据的开源技术框架。


一、背景

640?wx_fmt=png


1)携程酒店每天有上千表,累计十多亿数据更新,如何保证数据更新过程中生产应用高可用;


2)每天有将近百万次数据查询请求,用户可以从粗粒度国家省份城市汇总不断下钻到酒店,房型粒度的数据,我们往往无法对海量的明细数据做进一步层次的预聚合,大量的关键业务数据都是好几亿数据关联权限,关联基础信息,根据用户场景获取不同维度的汇总数据;


3)为了让用户无论在app端还是pc端查询数据提供秒出的效果,我们需要不断的探索,研究找到最合适的技术框架。


对此,我们尝试过关系型数据库,但千万级表关联数据库基本上不太可能做到秒出,考虑过Sharding,但数据量大,各种成本都很高。热数据存储到ElasticSearch,但无法跨索引关联,导致不得不做宽表,因为权限,酒店信息会变,所以每次要刷全量数据,不适用于大表更新,维护成本也很高。Redis键值对存储无法做到实时汇总,也测试过Presto,GreenPlum,kylin,真正让我们停下来深入研究,不断的扩展使用场景的是ClickHouse。


二、ClickHouse介绍

640?wx_fmt=png


ClickHouse是一款用于大数据实时分析的列式数据库管理系统,而非数据库。通过向量化执行以及对cpu底层指令集(SIMD)的使用,它可以对海量数据进行并行处理,从而加快数据的处理速度。


主要优点有:


1)为了高效的使用CPU,数据不仅仅按列存储,同时还按向量进行处理;


2)数据压缩空间大,减少io;处理单查询高吞吐量每台服务器每秒最多数十亿行;


3)索引非B树结构,不需要满足最左原则;只要过滤条件在索引列中包含即可;即使在使用的数据不在索引中,由于各种并行处理机制ClickHouse全表扫描的速度也很快;


4)写入速度非常快,50-200M/s,对于大量的数据更新非常适用;


ClickHouse并非万能的,正因为ClickHouse处理速度快,所以也是需要为“快”付出代价。选择ClickHouse需要有下面注意以下几点:


1)不支持事务,不支持真正的删除/更新;


2)不支持高并发,官方建议qps为100,可以通过修改配置文件增加连接数,但是在服务器足够好的情况下;


3)sql满足日常使用80%以上的语法,join写法比较特殊;最新版已支持类似sql的join,但性能不好;


4)尽量做1000条以上批量的写入,避免逐行insert或小批量的insert,update,delete操作,因为ClickHouse底层会不断的做异步的数据合并,会影响查询性能,这个在做实时数据写入的时候要尽量避开;


5)Clickhouse快是因为采用了并行处理机制,即使一个查询,也会用服务器一半的cpu去执行,所以ClickHouse不能支持高并发的使用场景,默认单查询使用cpu核数为服务器核数的一半,安装时会自动识别服务器核数,可以通过配置文件修改该参数;


三、ClickHouse在酒店数据智能平台的实践

640?wx_fmt=png


3.1 数据更新


我们的主要数据源是Hive到ClickHouse,现在主要采用如下两种方式:


1)Hive到MySql,再导入到ClickHouse


初期在DataX不支持hive到ClickHouse的数据导入,我们是通过DataX将数据先导入mysql,再通过ClickHouse原生api将数据从mysql导入到ClickHouse。


为此我们设计了一套完整的数据导入流程,保证数据从hive到mysql再到ClickHouse能自动化,稳定的运行,并保证数据在同步过程中线上应用的高可用。


640?wx_fmt=png


2)Hive到ClickHouse


DataX现在支持hive到ClickHouse,我们部分数据是通过DataX直接导入ClickHouse。但DataX暂时只支持导入,因为要保证线上的高可用,所以仅仅导入是不够的,还需要继续依赖我们上面的一套流程来做ReName,增量数据更新等操作。


针对数据高可用,我们对数据更新机制做了如下设计:


3.1.1全量数据导入流程


640?wx_fmt=png


全量数据的导入过程比较简单,仅需要将数据先导入到临时表中,导入完成之后,再通过对正式表和临时表进行ReName操作,将对数据的读取从老数据切换到新数据上来。


3.1.2增量数据的导入过程


640?wx_fmt=png


增量数据的导入过程,我们使用过两个版本。


由于ClickHouse的delete操作过于沉重,所以最早是通过删除指定分区,再把增量数据导入正式表的方式来实现的。


这种方式存在如下问题:一是在增量数据导入的过程中,数据的准确性是不可保证的,如果增量数据越多,数据不可用的时间就越长;二是ClickHouse删除分区的动作,是在接收到删除指令之后内异步执行,执行完成时间是未知的。如果增量数据导入后,删除指令也还在异步执行中,会导致增量数据也会被删除。最新版的更新日志说已修复这个问题。


针对以上情况,我们修改了增量数据的同步方案。在增量数据从Hive同步到ClickHouse的临时表之后,将正式表中数据反写到临时表中,然后通过ReName方法切换正式表和临时表。


通过以上流程,基本可以保证用户对数据的导入过程是无感知的。


3.2 数据导入过程的监控与预警


由于数据量大,数据同步的语句经常性超时。为保证数据同步的每一个过程都是可监控的,我们没有使用ClickHouse提供的JDBC来执行数据同步语句,所有的数据同步语句都是通过调用ClickHouse的RestfulAPI来实现的。


调用RestfulAPI的时候,可以指定本次查询的QueryID。在数据同步语句超时的情况下,通过轮询来获得某QueryID的执行进度。这样保证了整个查询过程的有序运行。在轮询的过程中,会对异常情况进行记录,如果异常情况出现的频次超过阈值,JOB会通过短信给相关人员发出预警短信。


3.3 服务器分布与运维


现在主要根据场景分国内,海外/供应商,实时数据,风控数据4个集群。每个集群对应的两到三台服务器,相互之间做主备,程序内部将查询请求分散到不同的服务器上做负载均衡。


假如某一台服务器出现故障,通过配置界面修改某个集群的服务器节点,该集群的请求就不会落到有故障的服务器上。如果在某个时间段某个特定的数据查询量比较大,组建虚拟集群,将所有的请求分散到其他资源富于的物理集群上。


下半年计划把每个集群的两台机器分散到不同的机房,可以继续起到现有的主备,负载均衡的作用还能起到dr的作用。同时为了保障线上应用的高可用,我们会实现自动健康检测机制,针对突发异常的服务器自动拉出我们的虚拟集群。


640?wx_fmt=png


我们会监控每台服务器每天的查询量,每个语句的执行时间,服务器CPU,内存相关指标,以便于及时调整服务器上查询量比较高的请求到其他服务器。


640?wx_fmt=png

640?wx_fmt=png

四、ClickHouse使用探索

640?wx_fmt=png


我们在使用ClickHouse的过程中遇到过各种各样的问题,总结出来供大家参考。


1)关闭Linux虚拟内存。在一次ClickHouse服务器内存耗尽的情况下,我们Kill掉占用内存最多的Query之后发现,这台ClickHouse服务器并没有如预期的那样恢复正常,所有的查询依然运行的十分缓慢。


通过查看服务器的各项指标,发现虚拟内存占用量异常。因为存在大量的物理内存和虚拟内存的数据交换,导致查询速度十分缓慢。关闭虚拟内存,并重启服务后,应用恢复正常。


2)为每一个账户添加join_use_nulls配置。ClickHouse的SQL语法是非标准的,默认情况下,以Left Join为例,如果左表中的一条记录在右表中不存在,右表的相应字段会返回该字段相应数据类型的默认值,而不是标准SQL中的Null值。对于习惯了标准SQL的我们来说,这种返回值经常会造成困扰。


3)JOIN操作时一定要把数据量小的表放在右边,ClickHouse中无论是Left Join 、Right Join还是Inner Join永远都是拿着右表中的每一条记录到左表中查找该记录是否存在,所以右表必须是小表。


4)通过ClickHouse官方的JDBC向ClickHouse中批量写入数据时,必须控制每个批次的数据中涉及到的分区的数量,在写入之前最好通过Order By语句对需要导入的数据进行排序。无序的数据或者数据中涉及的分区太多,会导致ClickHouse无法及时的对新导入的数据进行合并,从而影响查询性能。


5)尽量减少JOIN时的左右表的数据量,必要时可以提前对某张表进行聚合操作,减少数据条数。有些时候,先GROUP BY再JOIN比先JOIN再GROUP BY查询时间更短。


6)ClickHouse版本迭代很快,建议用去年的稳定版,不能太激进,新版本我们在使用过程中遇到过一些bug,内存泄漏,语法不兼容但也不报错,配置文件并发数修改后无法生效等问题。


7)避免使用分布式表,ClickHouse的分布式表性能上性价比不如物理表高,建表分区字段值不宜过多,太多的分区数据导入过程磁盘可能会被打满。


8)服务器CPU一般在50%左右会出现查询波动,CPU达到70%会出现大范围的查询超时,所以ClickHouse最关键的指标CPU要非常关注。我们内部对所有ClickHouse查询都有监控,当出现查询波动的时候会有邮件预警。


9)查询测试Case有:6000W数据关联1000W数据再关联2000W数据sum一个月间夜量返回结果:190ms;2.4亿数据关联2000W的数据group by一个月的数据大概390ms。但ClickHouse并非无所不能,查询语句需要不断的调优,可能与查询条件有关,不同的查询条件表是左join还是右join也是很有讲究的。


五、总结

640?wx_fmt=png


酒店数据智能平台从去年7月份试点,到现在80%以上的业务都已接入ClickHouse。满足每天十多亿的数据更新和近百万次的数据查询,支撑app性能98.3%在1秒内返回结果,pc端98.5%在3秒内返回结果。


从使用的角度,查询性能不是数据库能相比的,从成本上也是远低于关系型数据库成本的,单机支撑40亿以上的数据查询毫无压力。与ElasticSearch,Redis相比ClickHouse可以满足我们大部分使用场景。


我们会继续更深入的研究ClickHouse,跟进最新的版本,同时也会继续保持对外界更好的开源框架的研究,尝试,寻找到更合适我们的技术框架。


【推荐阅读】




640?wx_fmt=jpeg




Hive与ClickHouse的区别 阅读详情

相关推荐

【clickhouse】clickhouse的系统表

1.概述 转载:clickhouse的系统表 在日常使用clickhouse中经常会遇到很多问题,有时候需要去查系统表,但是对于我们来说,大部分的系统表的字段名称都不知道,看到了也不知道啥意思,下面我就整理一下clickhouse系统表的字段注释。 2.系统表 系统表用于实现系统的部分功能,并提供对有关系统如何工作的信息的访问。 不能删除系统表(但可以执行DETACH)。 系统表在磁盘上没有数据或元数据的文件。服务器在启动时创建所有系统表。 系统表是只读的。 它们位于 ‘system’ 数据库中。 2.1.

九师兄 4239

clickhouse原生监控项,系统表描述

原文链接:Monitoring | ClickHouse Docshttps://clickhouse.com/docs/en/operations/monitoringclickhouse推荐监控两大项:对于硬件资源利用率。clickhouse官网的意思,本身不会去监控硬件资源的状态,监控硬件需要第三方工具。clickhouse建议监控硬件项中的磁盘存储,RAM和网络使用率。对于clickhouse本身指标。如果想要跟踪clickhouse中发生的事件,可以通过ck的日志来查看,相关的连接:Server

Aiky哇 1465

智能车八邻域图像算法_二

智能车八邻域图像算法 文章目录智能车八邻域图像算法前言一、一些想法二、生长方向的使用1.点的生长方向的表示2. 用点的生长方向来做初步判断1.引入库2.读入数据总结 前言 上一篇里面讲过用八邻域来获得赛道边界:智能车八邻域图像算法 当已经能稳定获得赛道边界时,就可以进行元素识别,获得偏差了。 这里就介绍一下我的一些思路。 早在前两年,优快云上就有一篇关于八邻域如何处理元素的文章第十五届全国大学生智能汽车竞赛-双车组三轮图像处理总结,写得很好,我当时也参考了这篇文章,但是我觉得不是很详细,所以我这里想写得

技术缝合怪的博客 1万+

clickhouse 增量更新_干货 | 每天十亿级数据更新,秒出查询结果,ClickHouse在携程酒店的应用...

原标题:干货 | 每天十亿级数据更新,秒出查询结果,ClickHouse在携程酒店的应用作者简介蔡岳毅,携程酒店大数据高级研发经理,负责酒店数据智能平台研发,大数据技术创新工作。喜欢探索研究大数据的开源技术框架。一、背景1)携程酒店每天有上千表,累计十多亿数据更新,如何保证数据更新过程中生产应用高可用;2)每天有将近百万次数据查询请求,用户可以从粗粒度国家省份城市汇总不断下钻到酒店,房型粒度的数据...

weixin_26808439的博客 955

微生物测序分析LEfSe

LEfse分析定义 LEfse分析即LDA Effect Size分析,可以实现多个分组之间的比较,还进行分组比较的内部进行亚组比较分析,从而找到组间在丰度上有显著差异的物种(即biomaker);

宁生信 5万+

Tinder养号防封攻略来了:最新Tinder养号流程和运营攻略

今天,我就来给大家分享一下Tinder养号的具体操作,以及针对Tinder账号被封的一些常见问题为大家做个答疑。

m0_67768117的博客 2万+

干货 | 100亿+数据量,每天50W+查询,携程酒店数据智能平台实践

作者简介岳毅,携程高级研发经理,负责酒店数据智能平台研发,大数据技术创新工作。喜欢探索研究大数据的开源技术框架。背景随着大数据不断地融入到工作中,如何使大量的数据资产变现,并提供有价值...

携程技术 3497

飞控算法-姿态解算之互补滤波

飞控乱入之姿态解算 姿态解算是通过读取各个传感器的数据进行融合最终得到当前飞行器的姿态,姿态通常用Euler角(Roll-Pitch-Yaw)来表示 姿态解算框架 姿态解算的数据源可来自于陀螺仪或加速度计,他们分别都可以得到当前姿态,但实际上他们都有各自的传感器性能的优缺点,需要取长补短,进行数据融合才能得到真实的姿态,这种方法简称 互补滤波 算法 传感器特性 互补滤波 姿态解...

GoolyOh的专栏 1万+

ClickHouse 进阶之路(干货实战篇)

本篇主要是接触ClickHouse初期,用以学习的资料存放和传播,如有侵权,请联系本人,留言即可。 附上链接 【QQ音乐】QQ音乐PB级ClickHouse实时数据平台架构演进之路 https://zhuanlan.zhihu.com/p/145503455 【腾讯看点】腾讯看点基于 Flink 的实时数仓及多维实时数据分析实践 https://developer.aliyun.com/article/772472 【今日头条】最快开源OLAP引擎!ClickHouse在头条的技术演进 http:/.

weixin_38073361的博客 1952

别再傻傻分不清!用R语言5分钟搞定RR、AR、OR的计算与解读(附代码)

本文通过R语言实战演示,详细讲解了RR(相对风险)、AR(绝对风险)和OR(比值比)的计算方法与科学解读。提供完整的代码示例和可视化技巧,帮助医学研究者快速掌握这些核心流行病学指标的应用与常见陷阱规避。

weixin_42526015的博客 264

OFDM调制解调系统信道估计和均衡算法的MATLAB仿真

然后,从接收到的信号中提取导频序列,并使用LS算法进行信道估计。OFDM(正交频分复用)是一种常用于高速数据传输的调制技术,它将高速数据流分割成多个低速子载波,通过在不同的子载波上传输数据,实现了频域上的正交性。因此,信道估计和均衡算法在OFDM系统中起着至关重要的作用,用于减小信道衰落引起的影响。通过运行上述代码,可以进行基于LS算法的OFDM调制解调系统信道估计和均衡的MATLAB仿真。本文将介绍一种基于LS(最小二乘)算法的OFDM调制解调系统信道估计和均衡算法,并提供相应的MATLAB仿真代码。

uote_e的博客 229

clickhouse hbase性能对比_揭开 ClickHouse 快的面纱

https://www.jianshu.com/p/f9a54193dc63背景其实早在去年我们就已经开始接触并研究clickhouse了,因为当时进行多表关联测试性能并不是特别优秀,所以并没有在线上大范围使用,当时研究的是分布式部署 (感觉分布式会比单机好一些)最后发现性能并不怎么样 而且分布式的sql也有很多限制,不支持单条删除和更新操作、不支持in和join(当时的版本,18.12...

weixin_39724266的博客 8231

【华为OD机试】真题-小明减肥(Java)

摘要:题目要求从n个可选运动中选取k个,使其卡路里总和等于目标值t,统计可行方案数。输入包含运动数量n、目标t、选择数量k及卡路里数组。采用DFS回溯算法,通过剪枝优化(提前终止无效分支),分别处理选择/不选当前运动的情况。当遍历完所有运动且满足条件时计数。示例输入"4 3 2"和"1 2 3"时,输出2(对应两种选择组合)。Java实现通过递归完成搜索,最终输出符合条件的方案总数。(149字)

u014481728的博客 285

揭开 ClickHouse 快的面纱

https://www.jianshu.com/p/f9a54193dc63 背景 其实早在去年我们就已经开始接触并研究clickhouse了,因为当时进行多表关联测试性能并不是特别优秀,所以并没有在线上大范围使用,当时研究的是分布式部署 (感觉分布式会比单机好一些)最后发现性能并不怎么样 而且分布式的sql也有很多限制,不支持单条删除和更新操作、不支持in和join(...

Focus on Lakehouse 2658

损失函数大汇总(六十一)(Signed Distance Map Loss附公式推导与代码)

摘要 本文介绍了Signed Distance Map (SDM) Loss,一种将形状先验直接融入分割任务的方法。SDM将每个像素表示为到目标边界的带符号距离(内部为负,外部为正),相比二值mask能更连续地表达形状几何信息。SDM Loss的核心思想是让网络学习这个隐式形状场,通过可微的Heaviside函数近似将SDM转换为分割结果。文中重点分析了一种product-based regression loss,它能同时关注距离数值和内外符号的正确性,对边界区域尤为敏感。SDM Loss通常与传统的分割

悦学共鸣,温柔以待,汇聚光芒,共同成长 187

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

clickhouse之监控系列1-系统表

前言 不像其他的数据库产品由外部工具来提供监控功能,秉持“万物皆表”设计理念的Clickhouse自己内嵌了监控自己状态的工具,而且是以表的形式提供的,涉及system.metrics, system.events, system.asynchronous_metrics三张系统表。本文将首先来对这三张表来做一个说明,不管最终的监控是通过Prometheus还是Grafana来呈现,这三张表都是最终监控数据的来源。 system.metrics 该表记录的是一些即时计算出来的指标,显示的总是当前值,包括了三

普普通通程序猿的博客 1283

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ClickHouse 运维DBA实用场景

在 ClickHouse 默认的 system 数据库下(databse),拥有众多的系统表。CK 对外暴露的原生接口分为 TCP 和 HTTP 两类,通过 system.metrics 即可查询当前的 TCP、HTTP 与内部副本的连接数。在 ClickHouse 中有没有一些能够 “安家立命” 的运维 SQL 语句,为此做一次简单的分享。...

Klingx的博客 882

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

clickhouse常见问题之Too many simultaneous queries

解决clickhouse当前查询数过多的问题

普普通通程序猿的博客 1万+

使用clickhouse即席查询

controller:面向外部请求,提供数据查询,返回对应格式的数据 service:组合和数据层,提供数据服务(接口+实现类) mapper:单表操作(接口 + xml操作(sql) ) 1. com.atguigu.gmall0105.publisher.controller.PublisherController package com.atguigu.gmall0105.publisher.controller; import com.alibaba.fastjson.JSO..

qq_36213530的博客 1088

从ClickHouse中流式查询大数据

提示:本篇不适合手机阅读,主要为了提供代码实现。为了减速少大的Excel文件在内存中驻留,使用流的方式,边查询边组装,边下载文件相对来说是一个好的方式,下面是基于ClickHouse数据源的方式,下载100万条记录的处理方式,本地测试,内存只有100多M的使用,下载完后就会释放。注:下面的代码仅是演示代码,本文中的组装excel参考https://github.com/mini-software/...

dotNET跨平台 892

Clickhouse查看当前连接进程信息

ClickHouse自带用于记录系统信息的系统库system,通过processes表,我们可以查看当前连接的进程信息,也就是正在运行的sql的信息。 SELECT query_id, read_rows, total_rows_approx, memory_usage, initial_user, initial_address, elapsed, query, client_hostname FROM system.processe

shouwantao3369的博客 4359
上一篇: 干货 | 你们需要的PPT和视频@数据存储与微服务架构实践沙龙
下一篇: 干货 | 前端如何实现业务解耦,携程酒店查询首页的1.0到3.0
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值