hive-bucket连接有哪些用例

5cnsuln7  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(517)

我似乎找不到任何关于Hive中的bucket连接的好用例。
在我看来,当把表a和表b连接起来时:
bucket join节省了我们将表a传递给reducer的时间,同时将表b加载到分布式缓存中,每个Map器处理表b对应的bucket与表a对应的bucket。
但是,将表b加载到分布式缓存是由单个任务完成的,因此随着表变大,这就成为了一个瓶颈。
因此,如果表b足够小,不致于给单个任务带来负担,那么它实际上与使用小优化进行常规Map联接是一样的。
另一方面,如果表b不能容纳在一个Map器中,那么将其读取到分布式缓存的过程可能需要一段时间。
最后,似乎将表b加载到分布式缓存中的时间是值得的,因为我们不需要将表a的桶从Map器传递到还原器,但是这个过程不应该太重,除非表a真的很大,因为每个Map器将读取一个对应于单个缩减器的单个bucket(表由join键绑定),所以每个缩减器将获取2个中间输出(每个表一个,很有可能reducer与其对应的Map器运行在同一个节点上,并合并它们,从这一点来看,连接与Map器中的连接是相同的。
最后,我认为问题是什么成本更高:
通过单个任务将中等大小的表加载到分布式缓存中
将大量中等大小(可能很大)的bucket从Map器传递到reducer(大部分是本地的)并合并2个文件-所有这些都是并行完成的。
你怎么认为?有人能找到bucket join的好用法吗?

brqmpdu1

brqmpdu11#

我觉得你把bucket join和mapjoin搞混了。在map join中,较小的表被加载到分布式缓存中(假设它足够小),并发送给所有Map者。有一个1到n的对应关系。
在bucket连接中,连接两个大表,这两个表都以相同的方式存储数据:在n个bucket(文件)中,按要连接的同一列进行装箱和排序。所以表a有n个bucket,表b也有n个bucket,所以可以合并排序bucket#1 of a和bucket#1 of b,#2和#2等等,这是1:1的对应,n次。这也可以在map端完成,但不涉及分布式缓存。

相关问题