专栏名称: DBAplus社群
围绕数据库、大数据、PaaS云,顶级大咖、技术干货,运营几个月受众过十万!成为运维圈最专注围绕“数据”的学习交流和专业社群!欢迎投稿,加入探讨。
目录
相关文章推荐
AustinDatabases  ·  MySQL ... ·  8 小时前  
AustinDatabases  ·  MySQL ... ·  8 小时前  
数据分析与开发  ·  取代数据岗,某司数据从业人员已集体转行.... ·  昨天  
AustinDatabases  ·  ORACLE 最终会把 MySQL ... ·  昨天  
数据中心运维管理  ·  机房巡检必须关注的指标 ·  2 天前  
数据中心运维管理  ·  大数据中心建设方案 ·  4 天前  
51好读  ›  专栏  ›  DBAplus社群

数仓引入ClickHouse之后,性能提升了400%!

DBAplus社群  · 公众号  · 数据库  · 2020-11-04 07:15

正文


作者介绍

小琴,携程高级数据经理,负责酒店BI、数仓工作,专注于大数据应用领域多年。


一、背景


随着时间推移和业务的快速发展,携程酒店数据累积越来越多。目前流量日数据在3T左右,再加上各种订单、价、量、态等数据更是庞大。


现有Hive(Spark引擎)执行速度虽然相对较快,但在国际化发展背景下,一些海外业务由于时差问题,数据需要比国内提前数小时完成,所以性能提升迫在眉睫。2020年初,我们开始研究ClickHouse在数据仓库领域应用。


本文将从技术方案选型、集成开发环境封装、ClickHouse代码优化技巧、异常问题处理、服务器故障处理五个方面分享ClickHouse实践,希望给关注同样问题的同学有所启发。


二、技术预研与技术方案选型


公司内部有无ClickHouse集群使用环境?经过了解知晓,原ClickHouse验证集群正准备下线,无可用环境。


办公电脑通过Vmware搭建ClickHouse集群,部分同学基于单机练习ClickHouse语法以及验证各项ClickHouse特性,部分专攻ClickHouse集群搭建及各项配置、集成开发环境的封装等底层功能。


2020年3月,Vmware搭建ClickHouse集群基本完成各项验证,同时4台物理服务器(配置:内存-256G,CPU-40core,硬盘-3.5T)到位。为保证对生产平稳过渡(不给生产DB造成额外压力),我们从Hive ODS层同步数据至ClickHouse ODS层,技术方案如下图(橙色部分是ClickHouse实现部分):



三、集成开发环境封装


1、数据同步工具封装


我们发现消耗在数据同步上的时间太多,是数据计算时间的十几倍。于是开始研究ClickHouse数据导入方式,其中一种如下:



cat filename.orc | clickhouse-client -- query="INSERTINTO some_table FORMAT ORC"


在此基础上通过缓存、批处理等机制封装成新的orc2ck.sh同步工具,使同步速度比原先工具的性能提高500%以上。


2、集成开发工具封装


为了提高开发效率,减少代码冗余,我们封装了ClickHouse代码执行工具ck.sh,执行环境如下图(橙色部分是应用代码部分,红色框部分是封装工具及参数)。



四、ClickHouse代码优化技巧


1、小表置于join右侧降低内存消耗



2、用in替代join提高执行速度



3、减少数据扫描提高执行速度


通过增加过滤逻辑可以减少数据扫描,达到提高执行速度及降低内存消耗的目的。



五、异常问题处理



Code: 252, e.displayText() = DB::Exception: Too many parts (301) . Merges are processing significantly slower than inserts.


解决这个问题需要先分析Merge过程,如下图所示:



Merge过程是异步的,插入速度过快会导致以上错误,一般建议速度100w/s。



Code: 241, e.displayText() = DB::Exception: Memory limit (for query) exceeded


这种错误是请求内存高于系统分配内存导致,解决这类问题可以从两方面入手:


  • 在服务器内存充裕的情况下增加内存配额,一般通过max_memory_usage来实现;

  • 在服务器内存不充裕的情况下,建议将超出部分内容分配到系统硬盘上,但会降低执行速度;一般通过max_bytes_before_external_group_by 、max_bytes_before_external_sort参数来实现。


如果以上方法仍然无法解决问题,需要检查代码是否合理,从代码角度去优化(参考代码优化技巧部分)。


六、服务器故障处理





请到「今天看啥」查看全文

推荐文章
数据中心运维管理  ·  机房巡检必须关注的指标
2 天前
数据中心运维管理  ·  大数据中心建设方案
4 天前
孤读先生  ·  好女孩都难追
8 年前
学习学习再学习  ·  真正的学习,发生在行动之后
7 年前