Impala的神奇指令「COMPUTE STATS」

项目迭代中用Impala逐步替换原有的Hive作为查询组件,速度有了脱胎换骨的飞跃。但在把原先按列存储的表转换成两个按行存储的表之后,联表查询的表现不那么给力了(原先对Hive的十倍速度优势变成了两倍)。
考虑到项目转用Impala是我的提议,调整存储结构也是我的提议,这个结果确实是个让我丢面子的事情,于是挽起袖子找优化查询的方案。

优化前

Query: select count(a.sn) from usermodel_inter_total_label a join usermodel_inter_total_info b
on a.sn = b.sn where a.label = 'porn' and a.heat > 0.1 and b.platform = 'android'

Returned 1 row(s) in 36.86s

寻路

先不管三七二十一,按SQL调优的套路来,explain一下发现了一个很隐蔽的warning:

WARNING: The following tables are missing relevant table and/or column statistics.
default.usermodel_inter_total_info, default.usermodel_inter_total_label

这种waring,不是处(pian)女(zhi)座(kuang)发现不了!
先不忙,记下来,网上找那坑爹的Tuning Impala Performance文档看看(插个题外话,Impala的中文资料太寒酸了,做数据的矿工们已经全部投奔Spark阵营了么?),眼神掠过Column StatisticsTable Statistics的时候心里一凉,矿工的直觉告诉我「秘密就在这」!
大体意思就是通过预先分析表和列(对联表特别重要)的结构,并把这些信息保存到MetaStore,Impala查询时会利用这些信息优化查询的策略。
哟,这是个自动挡!
然后坑爹的文档就把我指到Hive的「ANALYZE TABLE」去了,试了半天Impala没反应啊,果然不是亲生兄弟~
祭出谷歌大法,噢,终于找到答案了,simple,naive!感觉找回了逝去的青春。

神奇指令

COMPUTE STATS usermodel_inter_total_info;
COMPUTE STATS usermodel_inter_total_label;

优化后

Query: select count(a.sn) from usermodel_inter_total_label a join usermodel_inter_total_info b
on a.sn = b.sn where a.label = 'porn' and a.heat > 0.1 and b.platform = 'android'

Returned 1 row(s) in 3.15s

Cool!10倍的提升,相对Hive20倍的提升,和单表查询一样的迅速!

分析

以前老师总说对待问题要知其然更要知其所以然,那时特反感这一句,人生苦短,除了要大干快上,还要及时行乐,哪来的时间去知道那么多道理。
好了离题了,让我做一回现象的搬运工,让更聪明的读者来为我们解释吧。
「COMPUTE STATS」前
指令:

show table stats usermodel_inter_total_label;

返回:

log_date#Rows#FilesSizeBytes CachedFormat
2014-12-13-1151.18GBNOT CACHEDTEXT
2014-12-14-131.80GBNOT CACHEDTEXT
2014-12-15-142.96GBNOT CACHEDTEXT
Total-1225.93GB0B-

指令:

show column stats usermodel_inter_total_label;

返回:

ColumnType#Distinct Values#NullsMax SizeAvg Size
snSTRING-1-1-1-1
labelSTRING-1-1-1-1
heatDOUBLE-1-1-1-1
active_recordSTRING-1-1-1-1
log_dateSTRING30-1-1

「COMPUTE STATS」后
指令:

show table stats usermodel_inter_total_label;

返回:

log_date#Rows#FilesSizeBytes CachedFormat
2014-12-1394984382469.76MBNOT CACHEDTEXT
2014-12-14178915951893.44MBNOT CACHEDTEXT
2014-12-152788547321.37GBNOT CACHEDTEXT
Total5527550652.71GB0B-

指令:

show column stats usermodel_inter_total_label;

返回:

ColumnType#Distinct Values#NullsMax SizeAvg Size
snSTRING13984716-13024.0039005279541
labelSTRING36-1134.26140022277832
heatDOUBLE382126-188
active_recordSTRING7-131.667400002479553
log_dateSTRING30-1-1

看来「COMPUTE STATS」的作用就是得出Impala原先不知道的值(-1)。

来自:建造者说

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值