2016-12-14 86 views
0

我有一个包含140亿条记录(大约1TB)的Hive表和8亿条记录(2GB大)的另一个Hive表。我想加入他们,我的策略是什么? 我有一个36节点群集。我使用50个执行程序,每个执行程序30 GB。Spark Hive表连接策略

从我所看到的,我的选择是:

  1. 广播2 GB表
  2. 刚刚加盟2个表盲目(我已经这样做了,它几乎回吐4小时完成)

如果我重新分配两个表并加入它们,它是否会提高性能?我观察到在第二种方法中,最后20个任务非常慢,我希望他们正在处理具有更多数据(偏斜数据)的分区。

+0

你看看提供的答案吗? – javadba

回答

2

如果给每个工作者足够的RAM,较小的表就可以放入内存。在这种情况下,地图边连接/边数据方法可能会很有用。

看看使用MapJoin提示:

SELECT /*+ MAPJOIN(b) */ a.key, a.value 
FROM a JOIN b ON a.key = b.key 

最重要的一点:

如果所有,但其中一个表被连接小,连接可以 作为执行只映射作业。关于它的用法

更多细节可以在这里看到:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins#LanguageManualJoins-MapJoinRestrictions