Apache Impala概念和架构
目录
本方提供一些相关的背景信息,可以帮助使用Impala和它的特性来提高生产效率。有助于理解Impala的各个方面与你可能已经熟悉的其他技术(如关系数据库管理系统和数据仓库)或其他Hadoop组件(如Hive、HDFS和HBase)之间的关系。
Impala 服务器组件
Impala服务器是一个分布式的大型并行处理(MPP)数据库引擎。它由不同的守护进程组成,这些进程运行在CDH集群中的特定主机上。
Impala 守候进程impalad
Impala的核心组件是一个守护进程,它运行在集群的每个数据节点(DataNode)上,它是一个叫impalad的进程。它负责读取和写入数据文件;接受从impala-shell传递过来的命令,Hue、JDBC或ODBC传输过来的查询;并行化查询请求并在整个集群中分配工作;将中间查询结果传输回中央协调器节点。
你可以向运行在任何数据节点(DataNode)上的Impala守护进程提交查询,该守护进程的实例将作为该查询的协调节点。其他节点将部分查询结果发送回协调器,它将构建查询的最终结果集。当通过Impala -shell命令进行功能操作时,你可能总会连接到同一个Impala守护进程上进行操作。对于支撑生产环境工作负载的集群,你可以通过使用JDBC或ODBC接口将每个查询提交给不同的Impala守护进程,从而实现负载均衡。
Impala守护进程与statestore一直保持通信,以确认哪些节点是健康的,可以接受新任务。
当集群中的任何Impala节点创建、修改或删除任何类型的对象时,或者当Impala处理插入(INSERT )或加载(LOAD DATA)操作时,它们也会接收来自catalogd守护进程(在Impala 1.2中引入)的广播消息。这种后台通信使得在Impala 1.2之前,跨节点协调元数据所需的刷新(REFRESH )或设置元数据失效(INVALIDATE METADATA )功能的操作次数降到最低。
在CDH 5.12 /
Impala 2.9和更高版本中,您可以控制哪些主机充当查询协调器,哪些主机充当查询执行器,以提高大型集群中高并发负载的可伸缩性。
Impala 状态存储进程Statestored
被称为statestore的Impala组件负责检查集群中所有数据节点(DataNode)上的Impala守护进程的健康状况,并不断地将其结果转发给每个守护进程。它是一个名为statestored的守护进程,而且只需要在集群中的某一个主机上运行这个进程。如果一个Impala守护进程由于硬件故障、网络错误、软件问题或其他原因而脱机,那么statestore会通知所有其他的Impala守护进程,以避免后来的查询请求被发送到那些无法连接的数据节点。
statestore的设计目标是当群集状态出错时提供帮助,它对Impala集群的正常运行并不重要。如果statestore不运行了或无法访问到,Impala守护进程将继续运行,并像往常一样分配工作,但是如果这时其他的Impala守护进程处在了脱机状态下,那么集群就变得不健壮了。当statestore重新上线时,它会重新建立与Impala守护进程的通信,并恢复其监控功能。
负载平衡和高可用性的大多数考虑都适用于impalad守护进程。statestored 和catalogd 守护进程对高可用性没有特殊要求,因为这些守护进程的问题不会导致数据丢失。如果这些守护进程由于某个主机的中断而不可用,您可以停止Impala服务,删除Impala
StateStore和Impala目录服务器角色,然后在另一个主机上添加这些角色,并重新启动Impala服务。
Impala 目录服务进程catalogd
被称为目录服务的Impala组件,维护着从Impala SQL语句到集群中的所有Impala守护进程需要用到的元数据。它是一个名为catalogd的守护进程,只需要在集群中的某一个主机上执行这个进程即可。因为请求是通过statestore守护进程传递的,所以在同一个主机上运行statestored 和catalogd服务是有它的好处的。
目录服务的存在,避免了在执行更改元数据的语句时要执行REFRESH和INVALIDATE METADATA 操作的需要。如果是使用HIVE,那么当创建一个表、加载数据等操作时,您需要在这个Impala节点上发出REFRESH或INVALIDATE METADATA ,然后再在这个节点上执行查询。
这些特性涉及到Impala的许多功能点:
[if !supportLists]· [endif]当CREATE TABLE、INSERT或其他表更改或数据更改的操作是通过Impal来执行的话,是不需要再REFRESH或INVALIDATE METADATA操作来更新信息的 。如果这些操作是通过Hive或直接在HDFS中操作数据文件来完成的,那么这些语句必需要在查询前执行的,只需要在一个Impala节点上执行这样的语句就可以了,而不需要在所有节点上都执行一回。
默认情况下,系统启动时,元数据的加载和缓存是异步的,因此Impala可以立即开始接受请求。如果需要Impala等待所有元数据在接受任何请求之前加载好,可以设置catalogd配置选项——load_catalog_in_background=false。
负载平衡和高可用性的大多数考虑都适用于impalad守护进程。statestored 和catalogd 守护进程对高可用性没有特殊要求,因为这些守护进程的问题不会导致数据丢失。如果这些守护进程由于某个主机的中断而不可用,您可以停止Impala服务,删除Impala StateStore和Impala目录服务器角色,然后在另一个主机上添加这些角色,并重新启动Impala服务。
开发Impala 应用程序
Impala的核心开发语言是SQL。还可以使用Java或其他语言通过标准的JDBC和ODBC接口与Impala进行交互,很多许多商业智能工具就是这样做的。对于专门的分析,还可以通过用c++或Java中编写用户定义函数(UDF)来补充SQL内置函数。
Impala SQL方言简介
Impala SQL方言与Apache Hive(HiveQL)中使用的SQL语法高度兼容。因此,对于已经熟悉在Hadoop基础设施上运行SQL查询的用户来说,使用Impala SQL是很容易的。目前,Impala SQL支持HiveQL语句、数据类型和内置函数的部分子集。Impala还包含了用于公共行业特性的额外的内置函数,以简化从非hadoop体系的系统当中移植SQL。
对于有着使用传统数据库或数据仓库背景的用户来说,SQL方言的以下几个方面特性应该是比较熟悉的:
SELECT语句包括熟悉的子句,例如WHERE、GROUP BY、ORDER BY和WITH。同时也有很多熟悉的概念,例如连接、处理字符串、数字和日期的内置函数、聚合函数、子查询和比较运算符(如IN()和BETWEEN)。SELECT语句是SQL标准程度当中最高的。
从数据仓库技术体系里,我们认识到分区表的概念。一个或多个列充当分区键,数据从物理上进行不同的安排,以便查询在WHERE子句中可以跳过与筛选条件不匹配的分区。例如,如果你有10年的数据,并使用某一查询条件,比如WHERE year = 2015,WHERE year > 2010,或者WHERE year IN (2014年,2015年),Impala跳过了所有非匹配年份的数据,大大减少了查询所需I/O的压力。
在Impala 1.2和更高版本中,udf让您在SELECT 和INSERT等语句执行期间去执行自定义比较和转换逻辑。
对于来自传统数据库或数据仓库背景的用户来说,希望精通Hadoop环境的话,以下几个关于SQL方言的方面,可能还需要一些学习和实践:
impala SQL专注于查询,包括的DML功能相对较少。没有UPDATE 或DELETE语句。陈旧的数据通常被直接丢弃(通过DROP TABLE 或ALTER TABLE或是DROP PARTITION语句等)或替换(通过INSERT OVERWRITE 语句)。
所有的数据创建都是通过INSERT语句完成的,这些语句通常通过从其他表查询相应数据来批量给别的表插入数据。有两种方式,INSERT INTO是追加数据到现有数据表,INSERT OVERWRITE是替换表或分区的全部数据(类似于TRUNCATE
TABLE 后跟一个新的INSERT)。虽INSERT VALUES语法是可以用于在单个语句中创建少量值,但如果需要将大量数据从一个表复制到另一个表的话,使用INSERT SELECT 语法会更合适。
有时我们会在其他环境中构建Impala表定义和数据文件,然后附加到Impala,以便它能够运行实时查询。这样就可以与Hadoop生态系统的其他组件共享相同的数据文件和数据表元数据。Impala可以访问由Hive创建的表或是Hive插入的数据,Hive可以访问Impala生成的表和数据。许多其他的Hadoop组件如果是用Parquet和Avro这样的格式来写入文件的,也可以通过Impala来查询。
由于Hadoop和Impala主要关注的是在大型数据集上进行数据仓库式的操作,Impala SQL包含了一些习惯用法与传统数据库系统的导入工具集很相似。例如,可以创建一个表来读取逗号分隔的或tab分隔的文本文件,达到这个效果只需要在create table语句中指定是哪种分隔符。您可以通过创建外部表,用于读取现有数据文件而不需要移动或转换这些数据。
Impala读取大量数据时,这些数据可能不是完全整洁和可预测的,因此不需要对字符串数据类型进行长度限制。例如,你可以将数据库列定义为具有无限长度的字符串,而不是CHAR(1)或VARCHAR(64)这样的。(在Impala
2.0和之后的更高版本中,是可以使用长度受限的CHAR和VARCHAR类型。)
Impala 编程接口简介
可以通过以下的方式连接Impala的守护进程并提交操作请求:
[if !supportLists]· [endif]impala-shell (交互式的命令行解析工具)
[if !supportLists]· [endif]Hue(一基于WEB界面的图形化工具)
[if !supportLists]· [endif]JDBC
[if !supportLists]· [endif]ODBC
有了这些接口方式,就可以在异构环境中使用Impala,在非linux平台上运行JDBC或ODBC应用程序。您还可以将Impala与各种使用JDBC和ODBC接口的商业智能工具结合起来使用。
每个impalad守护进程在集群当中的单独节点上运行,侦听多个端口来接收传入的请求。来自impala-shell和Hue的请求通过同一个端口被路由到impalad守护进程。而impalad守护进程对于侦听JDBC和ODBC的请求侧是用另外的独立端口。