Impala官网翻译05-Impala如何融入Hadoop生态系统?
Impala如何融入Hadoop生态系统?
Impala 利用了 Hadoop 生态系统中许多熟悉的组件。Impala可以作为消费者和生产者与其他Hadoop组件进行数据交换,因此它可以以灵活的方式适应您的ETL和ELT管道。
Impala如何与Hive合作
Impala的一个主要目标是使SQL-on-Hadoop操作足够快速和高效,以吸引新类别的用户,并将Hadoop开放给新类型的用例。在切实可行的情况下,它利用现有的Apache Hive基础架构,许多Hadoop用户已经有了这些基础架构来执行长期运行的、面向批次的SQL查询。
特别是,Impala将其表定义保存在称为元存储的传统MySQL或PostgreSQL数据库中,也就是Hive保存这类数据的同一数据库中。因此,只要所有列使用Impala支持的数据类型、文件格式和压缩编解码器,Impala就可以访问Hive定义或加载的表。
最初对查询功能和性能的关注意味着Impala使用SELECT语句可以读取的数据类型比使用INSERT语句可以写入的数据类型更多。要使用Avro、RCFile或SequenceFile文件格式查询数据,需要使用Hive加载数据。
Impala查询优化器还可以利用表统计和列统计。最初,你用Hive中的ANALYZE TABLE语句收集这些信息;在Impala 1.2.2和更高版本中,使用Impala COMPUTE STATS语句代替。COMPUTE STATS需要的设置更少,更可靠,而且不需要在impala-shell和Hive shell之间来回切换。
Impala元数据和Metastore概述
正如在《Impala如何与Hive一起工作》中所讨论的那样,Impala在一个称为metastore的中央数据库中维护着表定义的信息。Impala 还跟踪数据文件低级特性的其他元数据。
HDFS内块的物理位置。
对于具有大量数据和/或许多分区的表,检索一个表的所有元数据可能会很耗时,在某些情况下需要几分钟。因此,每个Impala节点都会缓存所有这些元数据,以便将来对同一表进行查询时重用。
如果表的定义或表中的数据被更新,集群中的所有其他Impala守护进程必须在发出针对该表的查询之前接收到最新的元数据,取代过时的缓存元数据。在Impala 1.2和更高版本中,元数据更新是自动的,通过catalogd守护进程协调,适用于通过Impala发出的所有DDL和DML语句。详情请参见Impala目录服务。
对于通过 Hive 发布的 DDL 和 DML,或者对 HDFS 中的文件进行手动更改,仍然使用 REFRESH 语句(当新数据文件添加到现有表时)或 INVALIDATE METADATA 语句(对于全新的表,或者在丢弃表、执行 HDFS 重新平衡操作或删除数据文件后)。发出INVALIDATE METADATA本身就可以检索元存储所跟踪的所有表的元数据。如果你知道只有特定的表在Impala之外被更改,你可以为每个受影响的表发出REFRESH table_name,只检索这些表的最新元数据。
Impala如何使用HDFS
Impala使用分布式文件系统HDFS作为主要数据存储介质。Impala依靠HDFS提供的冗余来防范单个节点的硬件或网络中断。Impala表数据在HDFS中以数据文件的形式物理表示,使用熟悉的HDFS文件格式和压缩编解码器。当数据文件存在于新表的目录中时,Impala会读取所有数据文件,而不考虑文件名。新数据添加在文件中,文件名由Impala控制。
Impala如何使用HBase
HBase是HDFS的替代品,作为Impala数据的存储介质。它是建立在HDFS之上的数据库存储系统,没有内置SQL支持。许多Hadoop用户已经配置了它,并在其中存储了大量(通常是稀疏的)数据集。通过在Impala中定义表,并将其映射到HBase中的等价表,你可以通过Impala查询HBase表的内容,甚至可以执行包括Impala和HBase表在内的连接查询。详情请参阅使用Impala查询HBase表。