Impala概念与架构
下面的内容介绍Cloudera Impala的背景资料及特性,以便你更高效的使用它。Where appropriate, the explanations include context to help understand how aspects of Impala relate to other technologies you might already be familiar with, such as relational database management systems and data warehouses, or other Hadoop components such as Hive, HDFS, and HBase.
继续阅读:
- Impala守护进程
- Impala Statestore
- Impala目录服务
- Impala SQL方言
- Impala编程接口
- Impala如何与Hive协同工作
- Impala元数据与Metastore
- Impala如何使用HDFS
- Impala如何使用HBase
Impala守护进程
Impala的核心组件是一个守护进程,即impalad进程,运行在集群中每一节点上。Impalad读、写数据文件;接受来自impala-shell命令行、Hue、JDBC或ODBC的命令;并行化查询并分发工作到集群中的其他节点上;并传递查询中间结果到中央协调器节点。
你可以向运行在任意节点上的Impala守护进程提交一个查询,这一节点成为该查询的协调器节点。其他节点传递局部结果回协调器节点,这将构成查询的最终结果。当在impala-shell命令行运行功能测试时,出于方便,你可能始连接到同一个Impala守护进程。而在生产集群中,你可能使用JDBC或ODBC接口,采用循环制负载均衡地向各个节点的Impala守护进程提交查询。
Impala守护进程定时与statestore通讯,以确定哪些节点是健康的,可以接受新的工作。
Impala守护进程接收catalogd守护进程(Impala 1.2中引入)的广播,广播信息包括集群中任意Impala节点上创建、修改、删除任意类型的对象,或者通过Impala执行的INSERT、 LOAD DATA语句。这一后台通讯最小化了在Impala 1.2 之前必须执行REFRESH或 INVALIDATE METADATA 语句以便跨节点元数据的需求。
Impala Statestore
Impala中用来检查集群中所有节点Impala守护进程健康情况的组件是statestore,并将它的发现持续的发送到这些Impala守护进程。这一组件对应的守护进程是statestored;一个集群中只需要一个节点上有这个守护进程。假如一个Impala节点因为硬件故障、网络错误、软件问题等等原因而离线,statestore会通知其他所有节点,这样以后的查询将避免请求无法访问的节点。
因为statestore的作用是出错时提供帮助,因此对于Impala集群的正常运行并不是至关重要的。如何statestore没有运行或者不可访问,其他节点会继续正常运行、互相之间正常分发工作;当statestore离线时,有节点失效,集群只是变得不太可靠。当statestore恢复在线,它将重建与其他节点的通讯,并恢复它的监控功能。
Impala目录服务
Impala中用来传递Impala SQL导致的元数据变化的组件是目录服务,它把这些变化传递给集群中所有的节点。这一组件对应的守护进程是catalogd;一个集群中只需要一个节点上有这个守护进程。因为请求是通过statestore传递的,因此statestored和catalogd 服务应当运行在同一节点上。
Impala 1.2中引入的这一新组件为了向减少执行 REFRESH 和 INVALIDATE METADATA 语句的需求。以前,当你在Impala节点上执行了 CREATE DATABASE 、 DROP DATABASE 、 CREATE TABLE 、 ALTER TABLE 、 DROP TABLE 语句,在其他节点上执行查询前,需要先执行 INVALIDATE METADATA,以使那些节点获取schema对象的变化。类似的,假如你在某个节点上执行了 INSERT 语句,在其他节点上执行查询前,需要先执行 REFRESH 表,以便能识别新添加的数据文件。目录服务避免了这些因在Impala中执行语句导致元数据变化而造成必须执行 REFRESH 和 INVALIDATE METADATA 语句的需要;但当你在Hive中创建表、载入数据时,仍然需要在执行查询前运行 REFRESH 或 INVALIDATE METADATA。
Impala 1.2中的这一新功能,涉及到了Impala的以下方面:
- 参见安装Cloudera Impala,升级 Impala、开始使用Impala,获取catalogd守护进程的实用信息
- 当在Impala中执行 CREATE TABLE 、 INSERT 或其他表修改、数据修改操作时,不再需要执行 REFRESH 或 INVALIDATE METADATA 语句。但是在Hive中执行这些操作,或者直接在HDFS操作数据是,这两个语句仍然需要,但是只需要在其中一个节点上运行,不再需要在所有节点上都运行。参见 REFRESH 、 INVALIDATE METADATA 语句用法了解最新用法。
- 参见Impala目录服务了解catalogd服务的相关信息。
Impala SQL方言
Impala SQL方言发源于Apache Hive组件(HiveSQL)使用的SQL语言。因此,对于已经熟练在Hadoop基础设施上运行SQL的用户来说,Impala SQL也很熟悉。当前来说,Impala SQL 支持HiveQL语句、数据类型以及内建函数的一个子集。
对于有传统数据库背景的用户来说,Impala SQL以下方面看起来熟悉或不同:
- Impala SQL专注于查询,有相对较少的DML语句,没有 UPDATE 和 DELETE 语句。过时的数据,通常直接废弃(通过 DROP TABLE 或 ALTER TABLE … DROP PARTITION 语句)或替换(通过 INSERT OVERWRITE 语句)。
- 使用 INSERT 语句来完成数据加载,通常是通过查询其他表来批量加载数据。有两种方式,INSERT INTO 向现有数据追加, INSERT OVERWRITE 替换整个表或分区(类似先 TRUNCATE TABLE 然后紧跟着一个 INSERT 操作),不支持 INSERT … VALUES 语法插入单行数据。
- 通常在许多其他环境中构建Impala表定义和数据文件,然后连接到Impala中以便进行实时查询。这些数据文件和表的元数据可以在Hadoop生态系统中共享。
- 因为Hadoop和Impala都专注于大数据集的数据仓库操作,因此Impala SQL包含许多传统数据库导入工具中用到的术语。例如,你可以在 CREATE TABLE语句中指定分隔符,读取逗号分隔或制表符分割的文本文件。也可以创建 external tables 读取现有文件而不用移动或转换它。
- 因为Impala读取大量的、可能是不完全整齐的、可预测的数据,它没有限制字符串数据类型的长度。例如,你应当定义数据库列为 STRING 而不是 CHAR(1) 或 VARCHAR(64)。
- 对于查询密集型程序,你会发现许多熟悉的概念,如连接(join)、内置的处理字符串、数字和日期的函数、聚集函数、子查询和比较运算如 IN() 和 BETWEEN。
- 在数据仓库世界里,你会认识到分区表(From the data warehousing world, you will recognize the notion of partitioned tables.)。
- Impala 1.2及以上版本中,用户定义函数(UDF)允许在 SELECT 和 INSERT…SELECT 操作者执行自定义比较、转换逻辑。
Impala编程接口
你可以通过以下方式连接Impala守护进程、提交请求:
- impala-shell交互式命令解释器
- 基于web的Apache Hue用户接口
- JDBC
- ODBC
通过这些接口,你可以在异构环境中使用Impala,在非Linux环境中运行JDBC或ODBC程序。也可以通过JDBC、ODBC接口,与不同的商务智能工具结合使用。
每一个Impala守护进程运行在集群中单独的节点上,监听几个端口,接收请求。来源于impala-shell和Hue使用相同的端口连接到Impala守护进程。Impala守护进程监听单独JDBC、ODBC的端口。
Impala如何与Hive协同工作
Impala的主要目标是使得Hadoop上的SQL操作足够快速和高效,以开拓Hadoop新类型的应用,吸引新类别的用户。实际上,它使用已有的Apache Hive的基础架构,而Apache Hive已经被许多Hadoop用户用作执行长时间运行的、面向批处理的SQL查询。(Where practical, it makes use of existing Apache Hive infrastructure that many Hadoop users already have in place to perform long-running, batch-oriented SQL queries.)
特别是,Impala使用传统的MySQL或PostgreSQL数据库保存它的数据定义作为metastore,而Hive也使用相同的数据库保存这些数据。因此,Impala可以直接访问Hive中定义的表或载入的数据,只要全部列使用Impala支持的数据类型、文件格式和压缩编码。
Impala最初专注于查询功能和性能,这意味着它可以在SELECT语句中查询许多类型的数据,远多于INSERT语句中支持的数据类型。你可以使用Hive载入Avro、RCFile、SequenceFile格式的文件,然后在Impala中查询。
Impala查询优化器也可以使用在Hive通过 ANALYZE TABLE 采集的表、列的统计信息。
Impala元数据与Metastore
像上面Impala如何与Hive协同工作所说,Impala在被称为metastore中央数据库中维护表定义信息。Impala还监控数据文件的其他的低层次的特征(Impala also tracks other metadata for the low-level characteristics of data files):
- 块在HDFS中的物理位置
对于有大量的数据和/或许多的分区的表,获取它的元数据是很耗时的,某些情况下需要几分钟。因此,每一个Impala节点会缓存这些元数据,以便将来针对相同表的查询可以重用。
假如表的结构或数据更新了,在执行针对这个表的查询之前,集群中所有节点的Impala守护进程必须获取最新的元数据,替换掉过期的缓存的元数据。在Impala 1.2版本以后,对于Impala中执行的所有 DDL 和 DML 语句,通过catalogd守护进程协调,元数据的更新是自动的。参见Impala目录服务了解详细信息。
对于Hive中执行的 DDL 和 DML 语句,或手工修改HDFS中文件,你仍然需要使用 REFRESH 语句(向现有表添加数据时)或 INVALIDATE METADATA 语句(当创建新表、删除表、执行HDFS rebalace操作、删除数据文件等之后)。执行 INVALIDATE METADATA后,将获取metastore中跟踪的所有表的所有元数据(Issuing INVALIDATE METADATA by itself retrieves metadata for all the tables tracked by the metastore)。假如你知道在Impala之外是哪些特定的表变化了,可以对每一个受影响的表执行 REFRESH 表名 来获取这些表的最新元数据。
Impala如何使用HDFS
Impala使用分布式文件系统HDFS作为主要的数据存储介质。Impala依靠HDFS提供的数据冗余来防范单个节点的硬件或网络故障。Impala中表的数据物理存放为HDFS中的数据文件,使用熟悉的HDFS文件格式和压缩编解码器。当数据文件出现在新表的目录后,Impala将无视文件名差异,读取该目录下所有文件。新数据被添加到Impala指定文件名的文件里(When data files are present in the directory for a new table, Impala reads them all, regardless of file name. New data is added in files with names controlled by Impala.)
Impala如何使用HBase
HBase可以作为替代HDFS作为存放Impala数据的存储介质。它是一个基于HDFS之上的数据库存储系统,但没有内置的SQL支持。许多Hadoop用户已经配置和存储了大量(通常是稀疏的)数据在里面。通过在Impala中定义表,并映射到HBase里面对应的表,可以在Impala里面查询HBase的内容。甚至可以对Impala和HBase中的表进行连接查询。参见使用Impala查询HBase表了解详细信息。