impala:共同定位块以防止网络流量

kxeu7u2r  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(250)

我的目标是防止节点之间不必要的数据交换,如果所需的块在同一个节点上(位于同一位置)。
我有两个表,a和b(简化示例):

Table A    Table B
ID         ID 
0          0 
0          0
0          1
1          
1

表a由两个Parquet文件组成,这两个文件产生两个块:

Block1      Block2
ID          ID
0           1
0           1
0

表b相同:

Block1      Block2
ID          ID
0           1
0

假设,我有两个节点n1,n2。表A-block1和表B-block1位于n1,表A-block2和表B-block2位于n2。
如果我有这样的问题

Select * from TableA INNER JOIN TableB on TableA.Id=TableB.Id

Impala 将在两个节点之间交换数据。它看起来类似于这个例子:

如果块在集群中随机分布,那么这个计划看起来是一样的,因此impala不会利用“本地”块。
我希望impala在tablea-block1和tableb-block1之间以及tablea-block2和tableb-block2之间进行本地连接,以防止网络流量。在 Impala 我怎么能这么做?

w1e3prcc

w1e3prcc1#

为了100%确保表存储在同一个节点中,可以将表合并到一个表中,但创建一个名为“原始表名”的新列,并根据数据的来源将其设置为表a或表b。然后可以从这个表中提取两个数据位并将它们连接起来。
此外,这也有助于阅读有趣的内容,并指出数据局部性在hadoop上实际上并没有那么高效:https://www.bluedata.com/blog/2015/05/data-locality-is-irrelevant-for-hadoop/

相关问题