我的目标是防止节点之间不必要的数据交换,如果所需的块在同一个节点上(位于同一位置)。
我有两个表,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 我怎么能这么做?
1条答案
按热度按时间w1e3prcc1#
为了100%确保表存储在同一个节点中,可以将表合并到一个表中,但创建一个名为“原始表名”的新列,并根据数据的来源将其设置为表a或表b。然后可以从这个表中提取两个数据位并将它们连接起来。
此外,这也有助于阅读有趣的内容,并指出数据局部性在hadoop上实际上并没有那么高效:https://www.bluedata.com/blog/2015/05/data-locality-is-irrelevant-for-hadoop/