Kyligence AI 服务 - 让大模型完成准确、可靠的数值计算和回答! 立即了解更多
AI 数智助理
Kyligence Zen Kyligence Zen
Kyligence Enterprise Kyligence Enterprise
Kyligence Turbo Kyligence Turbo
指标平台解决方案
OLAP 解决方案
行业解决方案
客户总览
金融
零售
制造
医药
其他
云平台
BI
寻求合作
资源
Kyligence Enterprise
Kyligence Zen
培训
Apache Kylin
Byzer
Gluten
博客
关于
市场活动
康凯森,美团点评大数据工程师,Apache Kylin Commiter,目前主要负责Apache Kylin在美团点评的平台化建设。
本文记录了他将Apache Kylin超高基数的精确去重指标查询提速数十倍的过程。
原文转载自InfoQ, 感谢康凯森撰文并授权发表。
问题背景
某业务方的Cube有12个维度,35个指标,其中13个是精确去重指标,并且有一半以上的精确去重指标单天基数在千万级别,Cube单天数据量1.5亿行左右。 业务方一个结果仅有21行的精确去重查询竟然耗时12秒多,其中HBase端耗时6秒多,Apache Kylin的Query Server端耗时5秒多:
SELECT A, B, COUNT(DISTINCT UUID), FROM TABLE WHERE DT = 17150 GROUP BY A, B
精确去重指标已经在美团点评生产环境大规模使用,印象中精确去重的查询的确比普通的Sum指标慢一点,但也挺快的。这个查询慢的如此离谱,我就决定分析一下,这个查询到底慢在哪。
优化1 将精确去重指标拆分HBase列族
我首先确认了这个Cube的维度设计是合理的,这个查询也精准匹配了Cuboid,并且在HBase端也只扫描了21行数据。
那么问题来了,为什么在HBase端只扫描21行数据却需要6秒多?一个显而易见的原因是Kylin的精确去重指标是用Bitmap存储的明细数据,而这个Cube有13个精确去重指标,并且基数都很大。我从两方面验证了这个猜想:
同样SQL的查询Sum指标只需要120毫秒,并且HBase端Scan仅需2毫秒。
用HBase HFile命令行工具查看并计算出HFile中单个KeyValue的大小,发现普通指标的列族中每个KeyValue平均大小是29B,精确去重指标列族的每个KeyValue平均大小却有37M。
所以我第一个优化就是将精确去重指标拆分到多个HBase列族,优化后的效果十分明显。查询时间从12秒多减少到5.7秒左右,HBase端耗时从6秒多减少到1.3秒左右,不过Query Server耗时依旧有4.5秒多。
优化2 移除不必要的toString避免Bitmap Deserialize
Apache Kylin的Query Server耗时依旧有4.5秒多,我猜测肯定还是和Bitmap比较大有关,但是为什么Bitmap大会导致如此耗时呢?为了分析Query Server端查询处理的时间到底花在了哪,我利用Java Mission Control进行了性能分析。
JMC分析很简单,在Apache Kylin的启动进程中增加以下参数: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -XX:StartFlightRecording=delay=20s,duration=300s,name=kylin,filename=myrecording.jfr,settings=profile
获得myrecording.jfr文件后,我们在本机执行jmc命令,然后打开myrecording.jfr文件就可以进行性能分析。从jmc的热点代码图中我们发现,耗时最多的代码竟然是一个毫无意义的toString。去掉这个toString之后,Query Server的耗时直接减少了1秒多。
优化3 获取Bitmap的字节长度时避免Deserialize
在优化2去掉无意义的toString之后,热点代码已经变成了对Bitmap的Deserialize。不过Bitmap的Deserialize共有两处,一处是Bitmap本身的Deserialize,一处是在获取Bitmap的字节长度时。于是很自然的想法就是是在获取Bitmap的字节长度时避免Deserialize Bitmap,当时有两种思路:
(1)在Serialize Bitmap时就写入Bitmap的字节长度
(2)在MutableRoaringBitmap序列化的头信息中获取Bitmap的字节长度。(Kylin的精确去重使用的Bitmap是RoaringBitmap)
最终确认思路2不可行,采用了思路1。
思路1中一个显然的问题就是如何保证向前兼容,我向前兼容的方法就是根据MutableRoaringBitmap Deserialize时的Cookie头信息来确认版本,并在新的Serialize方式中写入了版本号,便于之后序列化方式的更新和向前兼容。 经过这个优化后,Apache Kylin Query Server端的耗时再次减少1秒多。
优化4 无需上卷聚合的精确去重查询优化
从精确去重指标在美团点评大规模使用以来,我们发现部分用户的应用场景并 没有跨Segment上卷聚合的需求,即只需要查询单天的去重值,或是每次全量构建的Cube,也无需跨Segment上卷聚合。所以我们希望对无需上卷聚合的精确去重查询进行优化,当时我考虑了两种可行的方案
方案1: 精确去重指标新增一种返回类型
一个极端的做法是对无需跨Segment上卷聚合的精确去重查询,我们只存储最终的去重值。
优点:
存储成本会极大降低。
查询速度会明显提高。
缺点:
无法支持上卷聚合,与Apache Kylin指标的设计原则不符合。
无法支持Segment的Merge,因为要进行Merge必须要存储明细的Bitmap。
新增一种返回类型,对不清楚的用户可能会有误导。
查询需要上卷聚合时直接报错,用户体验不好,尽管使用这种返回类型的前提是无需上聚合卷。
实现难点:
如果能够接受以上缺点,实现成本并不高,目前没有想到明显的难点。
方案2 Serialize Bitmap的同时写入Distinct Count值。
对用户无影响。
符合现在Apache Kylin指标和查询的设计。
存储依然需要存储明细的Bitmap。
查询速度提升有限,因为即使不进行任何Bitmap Serialize,Bitmap本身太大也会导致HBase Scan,网络传输等过程变慢。
如何根据是否需要上卷聚合来确定是否需要Serialize Bitmap?
解决过程:
我开始的思路是从查询过程入手,确认在整个查询过程中,哪些地方需要进行上卷聚合。为此,我仔细阅读了Apache Kylin Query Server端的查询代码,HBase Coprocessor端的查询代码,Calcite的Example例子。发现在HBase端,Apache Kylin Query Server端,Cube Build时都有可能需要指标的聚合。
此时我又意识到一个问题:即使我清晰的知道了何时需要聚合,我又该如何把是否聚合的标记传递到精确去重的反序列方法中呢?现在精确去重的Deserialize方法参数只有一个ByteBuffer,如果加参数,就要改变整个Apache Kylin指标Deserialize的接口,这将会影响所有指标类型,并会造成大范围的改动。所以我把这个思路放弃了。
后来我”灵光一闪”,想到既然我的目标是优化无需上卷的精确去重指标,那为什么还要费劲去Deserialize出整个Bitmap呢,我只要个Distinct Count值不就完了。所以我的目标就集中在BitmapCounter本身的Deserialize上,并联想到我最近提升了Apache Kylin前端加载速度十倍以上的核心思想:延迟加载,就改变了BitmapCounter的Deserialize方法,默认只读出Distinct Count值,不进行Bitmap的Deserialize,并将那个Buffer保留,等到的确需要上卷聚合的时候再根据Buffer Deserialize 出Bitmap。
当然,这个思路可行有一个前提,就是Buffer内存拷贝的开销是远小于Bitmap Deserialize的开销,庆幸的是事实的确如此。最终经过这个优化,对于无需上卷聚合的精确去重查询,查询速度也有了较大提升。显然,如你所见,这个优化加速查询的同时加大了需要上卷聚合的精确去重查询的内存开销。我的想法是首先对于超大数据集并且需要上卷的精确去重查询,用户在分析查询时返回的结果行数应该不会太多,其次我们需要做好Query Server端的内存控制。
总结
通过总共4个优化,在向前兼容的前提下,后端仅通过100多行的代码改动,对Apache Kylin超高基数的精确去重指标查询有了明显提升,测试中最明显的查
近年来,随着商业环境的竞争日益激烈,企业对于实时数据服务的需求急剧增加。Kyligence 在服务众多客户的过
数据要素在银行各业务领域和流程中发挥着至关重要的作用,面对激烈的市场竞争和客户需求,银行越来越注重从数据管理中
作为一名消费者,炎热的夏天我们会走进一家便利店,从冰柜中选出一瓶汽水;下午工作有点累了,我们会在公司的自动贩卖
2024 年伊始,Kyligence 联合创始人兼 CEO 韩卿(Luke)分享了对 AI 与数据行业的一些战
房地产行业是我国国民经济中的重要支柱产业之一,在房地产市场供求关系发生重大变化的当下,房企面临多重挑战。Kyl
今年年初,Kyligence 高级副总裁兼合伙人葛双寅(Silas Ge)受邀在阿斯利康“跃行致远三十周年年会
2024 年伊始,Kyligence 联合创始人兼 CEO 韩卿在公司内部的飞书订阅号发表了多篇 Rethin
400 8658 757
工作日:10:00 - 18:00
已有账号? 点此登陆
预约演示,您将获得
完整的产品体验
从数据导入、建模到分析的全流程操作演示。
行业专家解惑
与资深行业专家的交流机会,解答您的个性化问题。
请填写真实信息,我们会在 1-2 个工作日内电话与您联系。
全行业落地场景演示
涵盖金融、零售、餐饮、医药、制造等多个行业,最贴合您的业务需求与场景。
Data + AI 应用落地咨询
与资深技术专家深入交流,助您的企业快速落地 AI 场景应用。
立即预约,您将获得
精准数据计算能力:
接入高精度数值计算大模型服务,为您的企业级AI应用提供强大支持。
个性化业务场景解决方案:
量身定制的计算模型和数据分析服务,切实贴合您的业务需求和应用场景。
Data + AI 落地应用咨询:
与资深专家深入探讨数据和 AI 如何帮助您的企业加速实现应用落地,构建更智能的数据驱动未来。
申请体验,您将获得
体验数据处理性能 2x 加速
同等规模资源、同等量级数据、同一套数据处理逻辑,处理耗时下降一半
专家支持
试用部署、生成数据、性能对比各操作环节在线支持