通过分区控制 Impala 中的数据局部性

Posted

技术标签:

【中文标题】通过分区控制 Impala 中的数据局部性【英文标题】:Control data locality in Impala by partitioning 【发布时间】:2014-02-15 13:05:50 【问题描述】:

如果在创建表时理想的数据位置或布局已知,我希望避免 Impala 节点通过网络从其他节点不必要地请求数据。这对于“非加法”操作很有帮助,在这种操作中,一个分区中的所有记录无论如何都需要在同一个位置(节点)(例如百分位数)。

是否可以告诉 Impala 对于任何 HDFS 副本,分区中的所有数据都应始终位于单个节点上?

在 Impala-SQL 中,我不确定“PARTITIONED BY”子句是否提供此功能。据我了解,Impala 将其分区分块到 HDFS 上的单独文件中,但 HDFS 不保证默认情况下相关文件或块的共同定位(而是试图实现相反的效果)。

发现了一些有关 Impala 对 HDFS 开发的影响的信息,但不清楚这些信息是否已经实施或仍在计划中:

http://www.slideshare.net/deview/aaron-myers-hdfs-impala (幻灯片 23-24)

提前谢谢大家。

【问题讨论】:

【参考方案1】:

关于您提到的幻灯片(“Co-located block replicas”)——它是关于在 Hadoop 2.1 中实现的 HDFS 功能 (HDFS-2576)。它提供了一个 Java API 来向 HDFS 提供关于应该放置块的位置的提示。

截至 2014 年,它还没有在 Impala 中使用,但它似乎确实为此奠定了一些基础 - 因为它会给 Impala 提供相当于在传统 MPP 数据库中指定分发密钥的性能。

【讨论】:

【参考方案2】:

不,这完全违背了拥有分布式文件系统和 MPP 计算的目的。它还会产生单点故障和瓶颈,尤其是当您谈论的是连接到自身的 250GB 表时。正是 Hadoop 旨在解决的问题。分区数据在名称节点上的 HDFS 中创建子目录,然后将数据复制到整个集群中的数据节点。

【讨论】:

我认为您在这里忽略了重点。有 Impala 分区(HDFS 文件)、这些文件的 HDFS 块和这些块的 HDFS 副本。目的是将与分区和单个副本相关的所有块一起保存在同一节点上。副本仍将放置在不同的节点上,但任何分区的所有数据都将在节点本地,这对于避免通过网络复制某些操作很重要。请查看上面提到的 Aaron Myers(Cloudera 的软件工程师和 Apache Hadoop 提交者)的幻灯片了解更多详细信息。

以上是关于通过分区控制 Impala 中的数据局部性的主要内容,如果未能解决你的问题,请参考以下文章

Impala - 替换表分区中的所有数据

Impala性能优化总结

将数据加载到 impala 分区表中

如何查看 impala 表中的分区数

Impala分区表

在Impala 和Hive里进行数据分区