14

性能提升 400%,ClickHouse 在携程酒店数仓的实践

 3 years ago
source link: https://www.infoq.cn/article/JUOKjKcGwOqfIZtklPuz
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

随着时间推移和业务的快速发展,携程酒店数据累积越来越多。目前流量日数据在 3T 左右,再加上各种订单、价、量、态等数据更是庞大。现有 Hive(Spark 引擎)执行速度虽然相对较快,但在国际化发展背景下,一些海外业务由于时差问题,数据需要比国内提前数小时完成,性能提升迫在眉睫。2020 年初,我们开始研究 ClickHouse 在数据仓库领域应用。

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

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

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

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

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

mMfyMb7.png!mobile

图 1

三、集成开发环境封装

1)数据同步工具封装

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

复制代码

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

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

2)集成开发工具封装

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

YN73Qv6.png!mobile

图 2

四、ClickHouse 代码优化技巧

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

ZZ3Az2M.png!mobile

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

eq6NN3B.png!mobile

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

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

ZNNzuuM.png!mobile

五、异常问题处理

复制代码

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

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

6ZzYZvQ.png!mobile

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

复制代码

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

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

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

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

六、服务器故障处理

故障背景:故障演练导致 ClickHouse 服务器被强行重启,ClickHouse 服务无法正常启动。

解决办法:根据 ClickHouse 错误日志 (clickhouse-server.err.log) 定位问题,发现 ClickHouse 服务启动时无法加载表的元数据,处理方式有两种:

1)删除或移走该表对应数据文件(本次故障使用了该方式,下图为错误日志)。

Ujuuem2.png!mobile

2)重建该表元数据(此方式更为合理)。

七、小结

截止 2020 年上半年,携程酒店订单主题以及 P1 体系报表已经全部实现完毕,大部分性能提升在 200% 以上,整体性能提升平均在 400% 左右,基本解决大部分应用场景的问题,后期我们将整合更多主题入仓,充分发挥 ClickHouse 的性能优势,进一步提升效率。此外,我们也在研究 Flink+ClickHouse 技术,推进实时数仓建设。

作者介绍:

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

本文转载自公众号携程技术(ID:ctriptech)。

原文链接:

性能提升 400%,ClickHouse 在携程酒店数仓的实践


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK