目录
Impala使用了Hadoop生态系统中许多大家熟悉的组件。Impala可以与其他Hadoop组件交换数据,可以作为消费者角色,也可以作为生产者角色,因此它可以灵活地适应ETL和ELT管道。
Impala 与Hive集成
Impala的主要的目标是使SQL-on-Hadoop的操作更为快速且高效,能够吸引新类型的用户,并让Hadoop适配新类型的应用场景。在实际应用中,它可以使用现有的Apache Hive基础设施,原来许多Hadoop用户已经在HIVE基础上操作长时间运行的、面向批处理的SQL查询。
特别是,Impala将它的表定义元数据保存在一个传统的MySQL或PostgreSQL数据库中,这个数据库被称为metastore。 Hive也是用这些类型的数据库保存着元数据。因此,Impala可以访问由Hive定义或加载的表,只要所有的列都使用Impala支持的数据类型、文件格式和压缩编解码器。
聚集于查询功能和性能意味着,相比于使用INSERT语句进行写入,Impala可以SELECT语句读取更多类型的数据。查询数据可以使用Avro、RCFile或SequenceFile文件格式,可以使用HIVE来加载这些数据。
Impala查询优化器还可以使用表统计和列统计信息。可以使用Hive中的ANALYZE
TABLE语句收集了这些信息;在Impala 1.2.2和更高版本中,使用Impala COMPUTE STATS语句。计算数据的统计信息需要很少的设置,更可靠,而且不需要在impala-shell和Hive shell之间来回切换。
Impala 元数据和元数据存贮库
Impala在中心数据库metastore中维护了关于表定义的信息。Impala还跟踪数据文件底层特征的其他元数据:
•HDFS中数据块的物理位置。
对于具有大量数据和/或多个分区的表,检索表的所有元数据可能非常耗时,在某些情况下需要几分钟。因此,每个Impala节点都会缓存所有这些元数据,以便以后针对同一表的查询进行重用。
如果表定义或表中的数据被更新,集群中的所有其他Impala守护进程必须接收最新的元数据,替换过时的缓存的元数据,然后再对该表发出查询。在Impala 1.2和更高版本中,通过Impala发出的所有DDL和DML语句的元数据更新是自动的,通过catalogd守护进程进行协调。
如果通过Hive 进行DDL和DML操作,或手动更改在HDFS中的文件,你仍然需要使用REFRESH语句(当新的数据文件被添加到现有表)或INVALIDATE METADATA 语句(添加了全新的表,或删除一个表,执行一个HDFS平衡操作,或删除数据文件)。通过impala自己发出INVALIDATE METADATA 语句,可以检索到metastore跟踪的所有表的元数据。如果知道在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的表。