找到导致效率问题的每个密钥的最小值

时间:2015-07-28 20:04:20

标签: sql performance hadoop mapreduce hive

我有一个非常大的表,CLAIMS,包含以下列:

p_key
c_key
claim_type

每一行由p_key,c_key唯一定义。通常每个p_key会有多个c_keys。该表如下所示:

p_key  c_key  claim_type
1      1      A
1      2      A
2      3      B
2      5      C
3      1      B 

我想找到每个p_key的最小c_key。这是我的问题:

SELECT p_key, 
min(c_key) as min_ckey
from CLAIMS
GROUP BY p_key

问题是,当我通过HIVE CLI(0.13)将其作为mapreduce工作运行时,reduce部分需要30分钟才能完成5%。我不完全确定什么可能导致简单的查询需要这么长时间。此查询提供了相同的问题:

SELECT p_key, 
row_number() OVER(PARTITION BY p_key ORDER BY c_key) as RowNum
from CLAIMS

所以我的问题是为什么看似简单的mapreduce工作的减少部分需要这么长时间?关于如何调查此问题/改进查询的任何建议也将不胜感激。

2 个答案:

答案 0 :(得分:1)

您知道数据是否不平衡?如果有一个p_key的{​​{1}}值与普通情况相比非常大,那么处理该p_key的reducer将花费很长时间。

或者,是否可能存在少量c_key值?由于您按p_key进行分组,这将限制执行有用工作的减速器数量。

答案 1 :(得分:1)

减少阶段分三个阶段进行。当< = 33%是洗牌时,33%和66%之间是分类,并且> = 67%是减少阶段。

你的工作听起来像是在减少阶段的洗牌部分被挂起。我的猜测是你的数据遍布全部,这部分是IO绑定的。您的观察结果将转移到减速器上。

您可以尝试分组数据:

create table claim_bucket (p_key string, c_key string, claim_type string) 
 clustered by (p_key) into 6 buckets 
 row format delimited fields terminated by ",";

您可能需要更多或更少的存储桶,这将需要初始化hive的一些繁重工作,但应加快后续查询使用p_key的表。

当然,你还没有留下太多其他东西。如果您发布编辑并提供更多信息,您可能会得到更好的答案。祝你好运。