追求卓越

打造极致文化与产品研发结合的最佳实践

神策已启动「卓越产品计划」

产品功能、性能、稳定性不断迈向新台阶

在上一篇文章《卓越产品计划丨神策分析之五重性能优化》中,我们了解了神策分析性能优化的的五重实践,主要包括批量导入性能优化、智能聚合表优化、数据重组织查询优化、查询去重优化、页面首次首屏加载时间优化。今天我们将重点讲述数据重组织查询优化。

在过去 7 年多的发展过程中,我们基于 Apache Impala 做了大量的二次开发,极大地优化了 Apache Impala 的查询性能。经过不断地探索与实践,我们开发的一些基于数据组织的性能优化效果显著,其中 shuffle merge 是其中重要的一项优化。

如下图所示,神策分析中,Event 数据按天和 EventBucket 做分区,即同一天的数据置于同一一级分区内,同一天的数据再按 EventBucket 分区,这样可以保证同一事件的数据在同一分区内,同时将分区内的文件按{User_id, Time}排序。

神策分析的 10+ 分析模型,大多基于按时间排序的用户事件序列进行分析,对该功能的性能优化,可以有效提升查询性能。

一、相关名词解读

在进行数据重组织查询优化的过程中,经常会提及不少名词,你都了解吗?为了帮助各位阅读,我们提取了常见的 5 个名词并做了详细解释。

1、数据模型

指神策分析中的事件模型。简单来说,事件模型包括事件(Event)和用户(User)两个核心实体,同时配合物品(Item)实体可以做各种维度分析。

2、数据组织

指按照一定的方式和规则来存储模型数据,比如数据如何做分区、如何建索引等。

3、数据重组织

对应数据组织,针对不合理的数据存储,重新组织模型数据,以提升数据的使用效率。

4、EventBucket

每个事件都有唯一的 Event_id, EventBucket 是对 Event_id 的分桶,在数据组织上,会将 Event 均匀地存放在 EventBucket 中,当前 EventBucket 默认为 10。

5、SamplingGroup

是对 User_id 的虚拟分桶。在数据重组织中, 会尽可能地将同一 User_id 的数据存放在同一 SamplingGroup 下,当前 SamplingGroup 默认为 64。

二、shuffle merge 原理

通常,exchange 算子后会接一个 sort 算子将数据按{User_id, Time}来排序,此时的排序为全排序,未利用底层数据的有序性,复杂度比较高,代价较大。shuffle merge 则可以充分利用底层数据的有序性,将全排序转化为归并排序,跳过耗时的 sort 算子,降低排序的时间复杂度,加速计算过程。

其优化前后的查询计划分别如下:

图 优化前后的查询计划

最终,基于此优化,我们可以实现如下逻辑的查询:

三、神策的数据重组织查询优化实践

在 shuffle merge 的实际应用中,对于数据量较大的客户,其分区内文件数量较多,再加上客户数据或存在延迟上报的情况,会形成比较多的小文件,进一步增加单分区内的文件数量,造成了以下问题:

  • 同一分区内同一 User_id 的数据分散在不同的文件里,在 shuffle 时需要一次打开多个文件,每个文件仅读一部分,带来大量的随机 IO。因为同一 User_id 的数据分散在不同的文件里,在多读取不同的 User_id 序列时,会存在同一文件多次读取的情况,IO 会成倍放大

  • 同一 User_id 的数据分散在不同的文件里,导致归并排序时归并路数过多,维护败者树的代价过高。单个文件读取较慢则会阻塞整个查询进程

为了减少上述问题带来的影响,我们需要尽可能地将同一分区下同一 User_id 的数据存放于同一文件中,这样可以明显减少归并路数,进而降低随机 IO,提升数据扫描性能。针对此,我们设计了虚拟分桶 SamplingGroup,它是 User_id 的 hash 值。在数据重组织具体应用过程中,将同一 SamplingGroup 的数据组织到同一文件中。重组织后的 Event 数据组织形式如下:

当数据量较大,且归并路数较多时,遇到慢文件的概率大大提升,很容易拖慢整体的 shuffle merge 速度;另外,在数据规整后,shuffle merge 的归并是按 SamplingGroup 串行执行的,未能充分利用 SamplingGroup 以提升并行度。针对此,我们提出了 merge all 的方案——将归并从 union 算子下移到 scan 阶段,直接桶对桶(SamplingGroup to SamplingGroup)做归并,如下图所示:

该方案能够直接在计算节点上,通过 hdfs api 对时间线上的同一 SamplingGroup 数据做归并,大大节省了网络间 shuffle 的数据量;更容易将谓词及列裁剪下推到 scan 阶段,以进一步减少数据扫描量;充分利用 hdfs api 的读优化功能,以提升 scan 效率;在计算节点较少或者内存不充足的情况下,可主动控制归并数量,按 SamplingGroup 分批归并,以降低计算所需内存。

另外,在和 profile 表做联合 join 时,可以采用 sort merge bucket join,进一步提升 join 效率,在 profile 表较大和内存资源有限的情况下发挥较大作用。

数据重组织查询优化后,神策数据帮助某客户实现了 shuffle merge 场景下 1 倍左右的性能提升,开启 merge all 后,其漏斗分析场景中的性能提升高达 40%~150%。

以上,我们围绕神策分析引擎数据重组织查询优化展开了详细描述,下一篇将从批量导入性能优化展开,敬请期待!

✎✎✎

【更多内容】

神策分析之五重性能优化

解读神策分析之报错优化、服务治理

神策内容管理发布活动创作平台

▼ 点击阅读原文”免费体验神策分析 demo

卓越产品计划丨神策分析性能优化详解:数据重组织查询优化相关推荐

  1. 一零四、前端性能优化详解

    1 前端性能优化 介绍 页面性能优化 浏览器 浏览器的主要作用 浏览器的组成结构 浏览器是多进程的 浏览器的渲染机制 重排reflow与重绘repaint 页面加载缓慢的原因 浏览器部分 代码部分 优 ...

  2. 转载:SqlServer数据库性能优化详解

    本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小 ...

  3. T- SQL性能优化详解

    http://www.cnblogs.com/Shaina/archive/2012/04/22/2464576.html 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较 ...

  4. JavaScript性能优化详解

    性能优化介绍 性能优化是不可避免的 无处不在的前端性能优化 function func(){arr = []arr[100000] = 'lg is a dog' } func() JavaScrip ...

  5. logback性能优化详解

    前言 不正确的日志打印不但会降低程序运行性能,还会占用大量IO资源和硬盘存储空间. 本文主要总结一些能提高日志打印性能的手段. 一.通过AsyncAppender异步输出日志 我们通常使用的Conso ...

  6. Android UI性能优化详解

    此文来自于MrPeak杂货铺,由于没法转载,只能贴这了,妄作者见谅:http://mrpeak.cn/android/2016/01/11/android-performance-ui 设计师,开发人 ...

  7. MYSQL性能优化详解(二)

    接着上一篇学习:http://www.cnblogs.com/quanzhiguo/p/6401453.html 七.MySQL数据库Schema设计的性能优化 高效的模型设计 适度冗余-让Query ...

  8. postgresql 开启大页_Postgresql-11.X 性能优化详解

    系统优化 修改 /etc/grub.conf 关闭 numa=off ,修改磁盘IO调度方式 elevator=deadline 修改方法: grubby --update-kernel=ALL -- ...

  9. SQL--数据库性能优化详解

    转:http://blog.csdn.net/andylaudotnet/article/details/1763573 转载于:https://www.cnblogs.com/zcttxs/p/32 ...

  10. mysql ssd 性能测试 写入_MySQL服务器的SSD性能问题分析和测试详解

    [问题] 我们有台HP的服务器,SSD在写IOPS约5000时,%util达到80%以上,那么这块SSD的性能究竟有没有问题,为解决这个问题做了下面测试. [工具] blktrace是linux下用来 ...

最新文章

  1. python平均工资-2019年我国程序员薪资统计,看看你出于什么水平?
  2. 软件包管理器 RPM 升级软件包过程分析
  3. nginx配置 vue打包后的项目 解决刷新页面404问题|nginx配置多端访问
  4. androidentity什么用_Android multipartentity的用法
  5. java银联接口代码_银联接口测试——详细(JAVA)(示例代码)
  6. MVVM模式下 触发器多条件判断
  7. Java扫码点餐小程序源码 智慧点餐系统源码 点餐APP SaaS模式
  8. 神舟IV号开发板-带屏例程源码修改bug(2.8寸屏)
  9. ionic在app内部打开pdf文件
  10. 中国的程序员培训是不是有问题?
  11. #Linux中的GCC编程# 20170731 C培训作业
  12. github+hexo+butterfly 搭建个人博客
  13. c语言过磅系统,衡安无人值守地磅称重系统过磅流程
  14. 小米10周年发布会后,我路转粉了!
  15. MATLAB中关于复矩阵的操作,新手易错
  16. Flink大数据计算框架
  17. 一对一家教如何辅导_大学生家教一对一上门辅导有用吗 收费标准是怎样的
  18. python两点之间最短距离_最短路径(图中两点间最短路径)
  19. 淘宝标题优化技巧有哪些禁区注意事项
  20. Windows 10源码一览!

热门文章

  1. 惠普服务器做虚拟化,节省成本立竿见影 惠普虚拟化技术详解
  2. html 自动执行vbs代码,vbs脚本教程 怎样在bat脚本中调用vbs脚本
  3. 思科网络模拟器Packet Tracer教程
  4. 简单的python的socket编程实例
  5. Unity3D NGUI图文混排聊天表情
  6. linux系统 打开网页,使用Linux终端浏览网页
  7. J2ME 访问JAR和JAD文件中的属性
  8. 基于SSM的小区物业管理系统(附源码+论文)
  9. Java后端编程技术微信群和QQ群
  10. 洋葱头动态鼠标指针绿色版