Impala 实现分布式连接的两种策略

Impala 实现分布式连接的两种策略

Broadcast Join

广播连接是Impala 最先使用、也是默认的连接策略

广播连接中 Impala 将较小的表通过网络分发到所有需要执行该连接的Impala后台进程中。分发完成后,参与连接的Impala进程会根据数据建立哈希表并保存在内存中。然后每个Impala后台进程读取大表在本节点中的数据并使用内存中的哈希表查找匹配的记录。

这种方式不需要讲整个大表的数据读入到内存,因此Impala使用1GB的缓存读取大表的数据,一部分一部分读入并进行连接。

  • 小数据集在每个节点中都占用内存。
  • 缓存在内存中的数据并不是整个表的数据,而是连接列的哈希值以及查询需要用到的列。
  • 小表会分发到所有Impala进程。
  • Impala 使用基于开销的优化估算表的大小并决定是否进行广播连接、哪个表比较小、哈希表需要多少内存等。

  • 小表数据分发并缓存完成后,大表的数据就流式地通过内存中小表的哈希表。每个Impala进程负责大表的一部分数据,扫面读入,并用哈希连接的函数计算值。
  • 大表的数据一般由Impala进程从本地磁盘读入从而减少网络开销。由于小表的数据已经缓存在每个节点中,因此在此阶段唯一可能的网络传输就是将结果发送给查询计划中的另一个连接节点。

Partitioned Hash Join

分区哈希连接需要更多的网络开销,但可以允许大表的连接而不要求整个表的数据都能放到一个节点的内存中。当统计数据显示表太大而无法放到一个节点的内存中或者有查询提示时就会使用分区哈希连接。

进行分区哈希连接时(也称为shuffle join),每个Impala进程读取两个表的本地数据,使用一个哈希函数进行分区并把每个分区分发到不同的Impala进程。

正如上图所示,大表的数据也通过相同的哈希函数就行分区并把分区发送能和小表相应数据进行连接的结点。注意,和广播连接不同的是,广播连接只有小表的数据需要通过网络分发,而分区哈希连接需要通过网络分发大表和小表的数据,因此需要更高的网络开销。

总而言之,Impala有两种连接策略:广播连接,需要更多的内存并只适用于大小表连接。分区连接,需要更多的网络资源,性能比较低,但是能进行大表之间的连接。

请使用浏览器的分享功能分享到微信等