我有一个无害的Hive查询,它将一个表中的一些数据覆盖到另一个表中。源表和目标表都已分区。目标表也是群集的。
此查询产生4个MR作业,最后一个作业总是在reduce阶段占用非常大的时间。我尝试增加减速器的数量,但这并没有帮助。在深入观察时,我注意到指定的130个减速器中的1个(最初是默认的26个减速器中的1个)似乎总是接收比其余减速器多得多的数据。我进一步尝试在分布良好的列上使用distribute子句,但这也没有帮助。
有没有办法可以弄清楚大多数数据似乎与一个减速机相比的原因是什么?或者,任何有关如何控制此数据量的建议都会非常有用。
我的代码(表名和列名已更改)。 目标在列l和m上分区 目的地由user_id
聚类set hive.enforce.bucketing = true;
set mapred.reduce.tasks=130;
insert overwrite table dest_table
select
coalesce(event_guid, "<UNKNOWN>") event_guid,
coalesce(a, "<UNKNOWN>"),
coalesce(b, "<UNKNOWN>"),
coalesce(user_id, "<UNKNOWN>"),
coalesce(c, "<UNKNOWN>"),
coalesce(d, "<UNKNOWN>"),
coalesce(e, "<UNKNOWN>"),
coalesce(f, "<UNKNOWN>"),
coalesce(g, "<UNKNOWN>"),
coalesce(h, "<UNKNOWN>"),
coalesce(i, "<UNKNOWN>"),
coalesce(j, "<UNKNOWN>"),
coalesce(k, "<UNKNOWN>"),
coalesce(l, "<UNKNOWN>"),
coalesce(m, "<UNKNOWN>"),
coalesce(n, "<UNKNOWN>"),
coalesce(o, "<UNKNOWN>"),
coalesce(p, "<UNKNOWN>"),
coalesce(q, "<UNKNOWN>"),
coalesce(r, "<UNKNOWN>"),
coalesce(to_date(from_utc_timestamp(s, "PST")), "0000-00-00"),
coalesce(cast(from_utc_timestamp(s, "PST") as string), '0000-00-00 00:00:00'),
coalesce(s, '0000-00-00 00:00:00'),
coalesce(t, '0000-00-00 00:00:00'),
coalesce(u, '0000-00-00 00:00:00'),
coalesce(cast(from_utc_timestamp(t, "PST") as string), '0000-00-00 00:00:00'),
coalesce(cast(from_utc_timestamp(u, "PST") as string), '0000-00-00 00:00:00'),
coalesce(to_date(from_utc_timestamp(u, "PST")), "0000-00-00"),
coalesce(v, "<UNKNOWN>"),
coalesce(w, "<UNKNOWN>"),
coalesce(x, "<UNKNOWN>")
from
source raw
where v is not null and w is not null and x is not null
distribute by event_guid
;
答案 0 :(得分:0)
这只是一个建议,但您可以在配置单元中使用TRANSFORM或MAP / REDUCE关键字来尝试自己的映射器和缩减器脚本来控制数据。对于例如选择密钥作为一个提供均匀分布的列(这是您尝试使用分发方式实现的目标) 可能需要进行一些HQL分析。在event_guid上运行group by,count(*)。计数是否均匀分布?