这是【kudu pk parquet】的第二篇,query2在kudu和parquet上的对比解析,其中kudu包含有不能下发的谓词。

3台物理机,1T规模的数据集,impala和kudu版本是我们修改后支持runtime filter的版本,结果对比如下图:

 
纵坐标表示耗时,矮表示性能好,耗时短,响应差近三倍。
首先,来我们来看两者的执行计划,颜色越鲜艳表示越耗时:
  • parquet

 
  • kudu

 
可以看到kudu左右两边各有一个鲜艳的红色框(节点),说明这两个执行节点耗时比较长,放大来看:
左边部分:
  • parquet

 
  • kudu


上面两个图的执行计划红色圈起来部分,parquet的扫描(“05:SCAN KUDU”)和关联(“09:HASH JOIN”)分别只要1秒钟左右,而kudu则要7秒和11秒。
大家注意到了没有,“07:SCAN KUDU”这个节点在两个引擎上返回的数据量是不一样的,parquet只返回了5条记录,kudu则返回了25条。同时这个返回结果是作为runtime filter应用于“06:SCAN KUDU”的,所以可以看到“06:SCAN KUDU”节点上返回的数据量,呈现几何级的差异(条件宽泛,所以匹配的数据量就多了)。接着,过滤出来的结果再runtime filter应用于“05:SCAN KUDU”节点。为什么“05:SCAN KUDU”节点的扫描动作会差7倍(kudu 7秒钟对比parquet 1秒钟)?
分析kudu的profile可以看到“05:SCAN KUDU”的runtime filter是在2秒钟(另外1个是在18秒后到达,无效)以后才到达的:

 
所以减去1秒钟的filter等待时间,对partsupp表扫描花了6秒钟时间,同样是扫描partsupp表为啥parquet只要扫描2秒钟,怎么解释?这涉及到了runtime裁剪分片,因为它们的关联键刚好是个主键
05:SCAN KUDU [kudu_1000g_2.partsupp]
   runtime filters: RF000 -> kudu_1000g_2.partsupp.ps_partkey, RF004 -> ps_suppkey
   mem-estimate=0B mem-reservation=0B
   tuple-ids=5 row-size=24B cardinality=800000000
----------------
所以动态裁剪分片很重要,这里就不再展开,以后有机会再解析。
扫描返回的数据多,直接导致后续的关联节点“09:HASH JOIN”时间变成11秒。
前面埋伏了1个地雷,有心的读者可以想一下。
右边部分:
  • parquet
 
  • kudu
 
上面两个图中,kudu的“00:SCAN KUDU”节点消耗了4秒钟,而parquet只需要817毫秒!
查看kudu的profile:
|  |  |  F07:PLAN FRAGMENT [RANDOM] hosts=3 instances=3
|  |  |  00:SCAN KUDU [kudu_1000g_2.part]
|  |  |     predicates: p_type LIKE '%NICKEL'
|  |  |     kudu predicates: p_size = 22
|  |  |     mem-estimate=0B mem-reservation=0B
|  |  |     tuple-ids=0 row-size=75B cardinality=1264911
|  |  |

可以看到有个“like”的谓词,但是kudu官网说“!=”和“like”目前是不支持的:

因为kudu不支持“like”谓词的下发,所以过滤的动作需要在impala侧执行,这就需要impala把kudu上的数据全部扫描读取过来,那么这个耗时跟parquet本地过滤显然是没法比的(网络IO+序列化反序列化),近5倍的差异。
然后,左边“02:SCAN KUDU”节点的runtime filter是在4秒钟后到达:
 
所以partsupp全表扫了3秒钟(减去1秒钟的filter等待时间),然后应用filter,接着扫描剩下的7秒钟(11秒-4秒),也即扫描花了10秒钟时间。耗时比parquet长的原因和最前面“左边部分”的“05:SCAN KUDU”一样,也涉及到了runtime裁剪分片,因为它们的关联键也是主键:
|  |  02:SCAN KUDU [kudu_1000g_2.partsupp]
|  |     runtime filters: RF008 -> ps_partkey
|  |     mem-estimate=0B mem-reservation=0B
|  |     tuple-ids=2 row-size=24B cardinality=800000000
|  |
这里埋伏第2个地雷。
-------------------------------------------------------------------------------------------
到此,TPC-H query2在kudu和parquet上执行耗时的对比已经解析完成,接下来挖出前面埋伏的2个地雷:
  1. 为什么parquet上“07:SCAN KUDU”只返回5条,而kudu返回了25条?
  2. 在kudu执行计划中,同样是扫描partsupp表,为啥“左边部分”“05:SCAN KUDU”节点只耗时7秒钟,而“右边部分”“02:SCAN KUDU”节点则耗时11秒钟?

本文来自网易云社区,经作者何李夫授权发布。

原文地址:【kudu pk parquet】TPC-H Query2对比解析

更多网易研发、产品、运营经验分享请访问网易云社区

【kudu pk parquet】TPC-H Query2对比解析的更多相关文章

  1. 【kudu pk parquet】runtime filter实践

    已经有好一阵子没有写博文了,今天给大家带来一篇最近一段时间开发相关的文章:在impala和kudu上支持runtime filter. 大家搜索下实践者社区,可以发现前面已经有好几位同学写了这个主题的 ...

  2. 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询

    相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 自APIJSON发布 ...

  3. Zsh vs. Bash不完全对比解析,zsh是一种更强大的被成为“终极”的Shell

    https://www.zhihu.com/question/21418449 Mort | Zsh vs. Bash:不完全对比解析(1) 2014-10-07  bdpqlxz     Zsh和B ...

  4. 【原创】大叔经验分享(63)kudu vs parquet

    一 对比 存储空间对比: 查询性能对比: 二 设计方案 将数据拆分为:历史数据(hdfs+parquet+snappy)+ 近期数据(kudu),可以兼具各种优点: 1)整体低于10%的磁盘占用: 2 ...

  5. 5分钟看懂svg path 路径的所有命令(更有API解释、有图、有图文对比解析)

    友情提示:更多详情.每个命令的例子.参数变化对比图文详解,欢迎关注九十七度的博客:SVG<Path>命令详解 M = moveto M x y 移动到指定坐标,xy分别为x轴和y轴的坐标点 ...

  6. Splunk和ElasticSearch深度对比解析(转)

    转载自:http://www.sohu.com/a/154105465_354963 随着Splunk越来越被大家熟知和认可,现在市面上也不断涌各种同类产品,作为大数据搜索界的翘楚Splunk和Ela ...

  7. 数据库管理哪家强?Devart VS Navicat 360°全方位对比解析

    今天小编向大家推荐的是两个开发环节的主流数据库管理品牌,那么你知道这两款数据库管理软件品牌与数据库引擎配套的管理软件有什么区别吗?小编这就360°全方位为您解答: ★ 品牌介绍 Devart:拥有超过 ...

  8. str.match(regex)与regex.exec(str)对比解析,从此不再晕

    match属于字符串的方法,exec属于正则表达式的方法.其中regex是否有g标志的区别经常搞不清,所以测试记录下. 1.str.match(regex) regex中无g标志 返回一个数组,arr ...

  9. Hadoop和Spark的Shuffer过程对比解析

    Hadoop Shuffer Hadoop 的shuffer主要分为两个阶段:Map.Reduce. Map-Shuffer: 这个阶段发生在map阶段之后,数据写入内存之前,在数据写入内存的过程就已 ...

随机推荐

  1. windows下使用nginx

    本文介绍如何在windows下使用nginx 起步 下载安装 将nginx安装成windows服务 常用命令 构建服务 静态服务 代理服务器 http配置文件转移 负载均衡 负载均衡配置 负载均衡方法 ...

  2. leetcode696

    本题先寻找字符串中0变1,或者1变0的位置作为分隔位置.然后从这个分隔位置同时向左.右两侧搜索. 找到的左连续串和右连续串,都进行累计. public class Solution { public ...

  3. java之飞机大战的记分标准

    import java.awt.Image; import java.util.ArrayList; import java.util.Timer; import javax.swing.ImageI ...

  4. ssh免密连接远程服务器

    ssh免密连接远程服务器 借助ssky-keygen和ssh-copy-id工具,通过4个简单的步骤实现无需输入密码登录远程Linux主机 1 生成密钥 通过内置的工具生成RSA算法加密的密钥 ssh ...

  5. CentOS7 启动docker.service失败(code=exited, status=1/FAILURE)

    启动报错 Job for docker.service failed because the control process exited with error code. See "sys ...

  6. centos 搭建docker环境

    我有一台便宜的腾讯云服务器,当然配置自然也是最低的,只是用来平常玩一玩,学习的用处,下面介绍一下我在上面搭建docker的心得,共勉一下. 安装与配置 Docker 安装 Docker Docker ...

  7. window7 和ubuntu 双系统时 ubuntu不能引导怎么办?

    假如你的Ubuntu的 / 分区是sda9,又假如 /boot分区是 sda6,在终端下输入sudo -imount /dev/sda7 /mntmount /dev/sda6 /mnt/boot ( ...

  8. CentOS双网卡双IP设置

    CentOS双网卡双IP设置 系统环境:CentOS Linux 网络环境: 两个IP地址,192.168.0.10和10.10.30.2,掩码是255.255.255.0,这两个子网的网关地址分别是 ...

  9. Python3 常用爬虫库的安装

    Python3 常用爬虫库的安装 1 简介 Windows下安装Python3常用的爬虫库:requests.selenium.beautifulsoup4.pyquery.pymysql.pymon ...

  10. Entity Framework 6.0 Tutorials(6):Transaction support

    Transaction support: Entity Framework by default wraps Insert, Update or Delete operation in a trans ...