我似乎找不到任何在 hive 中加入桶的好的用例。
如我所见,当将表 A 与表 B 连接时:
桶连接为我们节省了将表 A 传递给减速器的时间,同时将表 B 加载到分布式缓存中,并且每个映射器处理表 B 的相应桶与表的桶一个。
但是,将表 B 加载到分布式缓存中是由单个任务完成的,因此随着表变大,这将成为一个瓶颈。
因此,如果表 B 足够小,不会对单个任务造成负担,那么它实际上与使用小优化进行常规 map-join 相同。
另一方面,如果表 B 不能放入具有整体的单个映射器中,则将其读取到分布式缓存的过程可能需要一段时间。
最后,似乎将表 B 加载到分布式缓存中的时间可能是值得的,因为我们不需要将表 A 的存储桶从映射器传递到减速器,但是这个过程不应该太繁重,除非表 A确实很大,因为每个映射器都会读取一个对应于单个减速器的存储桶(表由连接键存储)每个减速器获取 2 个中间输出(每个表一个,减速器运行在与其对应的映射器相同的节点)并合并它们,从这一点开始,连接与映射器中的连接相同。
总而言之,我认为问题是什么成本更高:
- 通过单个任务将中等大小的表加载到分布式缓存中
- 将许多中等(可能很大)大小的桶从映射器传递到减速器(主要是本地)并合并 2 个文件 - 所有这些都是并行完成的。
你怎么看?有人能找到桶加入的好用法吗?