2015-12-02 79 views
1

我已经做了深入的研究,但我不能发现什么不够详细.. 我读过这些: 1)http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/PDF/cloudera-impala.pdf 2)http://www.cidrdb.org/cidr2015/Papers/CIDR15_Paper28.pdf为什么分区连接(shuffle)并不总是比广播连接好?

,但我没有找到任何答案..

有人可以解释为什么分区连接并不总是更好吗? 我的意思是如果我们有两个表T1(大一)和T2(小一),如果我使用分区策略,它们都是分区的,我们有T1/n-1子集发送到其他节点, T2。另一方面,如果我选择播放一个Impala将发送T2 * n-1的数据给其他人..

也许我不明白这些策略是如何工作的..如果我错了,有人可以解释我请?也许用一个简单的画? (我已经搜查谷歌图片..)

在此先感谢

回答

3

分区是不是免费的,无论是生成和探测(左,右),双方需要进行分区做分区加盟。每个分区都需要一个交换计划片段作为孩子,并且每个都会产生网络传输。但是,如果构建侧很小,那么每个节点都可以拥有它的副本(即广播),然后利用左侧未分区的探测构建侧散列表,而不在探测器侧引入额外的子交换。事实上,广播所需的交换特别昂贵,因为每个发送者都需要发送给N个接收者。

什么是“足够小”来执行广播连接?它取决于许多因素,但最明显也很重要的是,构建端哈希表应该适合内存。

下面是一个示例方案,其中加入的策略是BROADCAST:

[localhost:21000] > explain select * from alltypes t1 join alltypessmall t2 on t1.id = t2.id; 
Query: explain select * from alltypes t1 join alltypessmall t2 on t1.id = t2.id 
+-----------------------------------------------------------+ 
| Explain String           | 
+-----------------------------------------------------------+ 
| Estimated Per-Host Requirements: Memory=160.01MB VCores=2 | 
|               | 
| 04:EXCHANGE [UNPARTITIONED]        | 
| |               | 
| 02:HASH JOIN [INNER JOIN, BROADCAST]      | 
| | hash predicates: t1.id = t2.id       | 
| |               | 
| |--03:EXCHANGE [BROADCAST]        | 
| | |              | 
| | 01:SCAN HDFS [functional.alltypessmall t2]    | 
| |  partitions=4/4 files=4 size=6.32KB     | 
| |               | 
| 00:SCAN HDFS [functional.alltypes t1]      | 
| partitions=24/24 files=24 size=478.45KB    | 
+-----------------------------------------------------------+ 

而且这里是连接策略划分样本:

Query: explain select * from tpch.lineitem t1 join tpch.lineitem t2 on t1.l_orderkey = t2.l_orderkey 
+-----------------------------------------------------------+ 
| Explain String           | 
+-----------------------------------------------------------+ 
| Estimated Per-Host Requirements: Memory=815.44MB VCores=2 | 
|               | 
| 05:EXCHANGE [UNPARTITIONED]        | 
| |               | 
| 02:HASH JOIN [INNER JOIN, PARTITIONED]     | 
| | hash predicates: t1.l_orderkey = t2.l_orderkey   | 
| |               | 
| |--04:EXCHANGE [HASH(t2.l_orderkey)]      | 
| | |              | 
| | 01:SCAN HDFS [tpch.lineitem t2]      | 
| |  partitions=1/1 files=1 size=718.94MB    | 
| |               | 
| 03:EXCHANGE [HASH(t1.l_orderkey)]       | 
| |               | 
| 00:SCAN HDFS [tpch.lineitem t1]       | 
| partitions=1/1 files=1 size=718.94MB     | 
+-----------------------------------------------------------+ 
Fetched 16 row(s) in 0.03s 

注意,后者计划有一个额外的交换。这意味着有一个额外的扫描计划片段(ID 00)。