【问题标题】:Impala: Co-locating blocks to prevent network trafficImpala:共同定位块以防止网络流量
【发布时间】:2018-02-25 21:26:19
【问题描述】:

如果需要的块在同一个节点上(位于同一节点),我的目标是防止节点之间不必要的数据交换。

我有两个表,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。 TableA-Block1 和 TableB-Block1 在 N1 上,TableA-Block2 和 TableB-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 中做到这一点?

【问题讨论】:

    标签: java hdfs cloudera impala


    【解决方案1】:

    要 100% 确保表存储在同一个节点中,您可以将表合并到一个表中,但创建一个名为“原始表名”的新列,并将其设置为表 A 或表 B,具体取决于数据的起源。然后,您可以从该表中提取这两个数据位并将它们连接起来。

    这也使阅读变得有趣,并表明数据局部性在 Hadoop 上实际上并没有那么高效: https://www.bluedata.com/blog/2015/05/data-locality-is-irrelevant-for-hadoop/

    【讨论】:

    • 非常感谢您的回答!如果我正确理解了桶的概念,我必须按表创建时间定义桶的数量。在我的示例中,我将其设置为 2,因为我有 2 个节点。因此,如果我是正确的,它应该导致 ID 为 0、2、4 的 bucket0 和 ID 为 1、3、5 的 bucket1 。但是如何保证文件/存储桶位于正确的节点上?这不是由 HDFS 自己处理的吗? HDFS 可以将两个桶(=blocks?)定位在同一个节点上,而不是在节点 0 上定位桶 0,在节点 1 上定位桶 1。
    • 如果我对另一个表 (B) 执行相同操作,Impala 会进行本地连接(tableA-bucket0 与 tableB-bucket0 等)?
    • 今天已经对此进行了更详细的研究,即使使用分桶,块分配给节点也是随机的。因此,似乎最好的解决方案是按照我在答案中指定的方式组合数据集。我现在将修改我的答案。
    • 是的,区块是随机分布的。您的 UNION 解决方案是正确的,以保证正确的存储桶/块放置。但即便如此,查询计划看起来还是如上所示(带有两个交换框)。我如何告诉 Impala 在本地进行连接?还是 Impala 总是显示交换,尽管一切都是在本地完成的,我必须寻找网络吞吐量(那么应该是 0 MB/秒,除了所有连接结果都发送到“最终”节点时的最终结果)?我知道这篇文章,但这当然取决于您的网络。我想完成这项工作。
    • 您如何量化这种数据交换的影响? IE。您如何判断通过网络交换数据的影响程度?
    猜你喜欢
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    相关资源
    最近更新 更多