0

我似乎找不到任何在 hive 中加入桶的好的用例。
如我所见,当将表 A 与表 B 连接时:
桶连接为我们节省了将表 A 传递给减速器的时间,同时将表 B 加载到分布式缓存中,并且每个映射器处理表 B 的相应桶与表的桶一个。

但是,将表 B 加载到分布式缓存中是由单个任务完成的,因此随着表变大,这将成为一个瓶颈。
因此,如果表 B 足够小,不会对单个任务造成负担,那么它实际上与使用小优化进行常规 map-join 相同。

另一方面,如果表 B 不能放入具有整体的单个映射器中,则将其读取到分布式缓存的过程可能需要一段时间。

最后,似乎将表 B 加载到分布式缓存中的时间可能是值得的,因为我们不需要将表 A 的存储桶从映射器传递到减速器,但是这个过程不应该太繁重,除非表 A确实很大,因为每个映射器都会读取一个对应于单个减速器的存储桶(表由连接键存储)每个减速器获取 2 个中间输出(每个表一个,减速器运行在与其对应的映射器相同的节点)并合并它们,从这一点开始,连接与映射器中的连接相同。

总而言之,我认为问题是什么成本更高:

  1. 通过单个任务将中等大小的表加载到分布式缓存中
  2. 将许多中等(可能很大)大小的桶从映射器传递到减速器(主要是本地)并合并 2 个文件 - 所有这些都是并行完成的。

你怎么看?有人能找到桶加入的好用法吗?

4

1 回答 1

0

我认为您将桶连接与 mapjoin 混淆了。在 map 连接中,较小的表被加载到分布式缓存中,假设它足够小,并且它被发送到所有映射器。有一个1到N的对应关系。

在存储桶连接中,您将连接两个大表,这两个表都以相同的方式存储数据:在 N 个存储桶(文件)中,按您要连接的同一列进行存储和排序。所以表 A 有 N 个桶,表 B 也有 N 个桶,所以你可以将 A 的 #1 桶与 B 的 #1 桶,#2 和 #2 等合并排序。这是 1 对 1 的对应关系,N 次。这也是在地图端完成的,但不涉及分布式缓存。

于 2013-07-01T06:40:05.577 回答