2014-08-25
参考链接:
Cloudera Impala User Guide:http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH5/latest/Impala/impala.html
Impala提供针对Hadoop文件格式的高性能、低延迟SQL查询,快速的查询响应可以让我们能够对分析查询进行交互探索和微调,而传统的长时间批处理job无法与之相比。
Impala与Hivemetastore database相集成,这两个组件之间可以共享database和table。与Hive的高度集成,与HiveQL语法的兼容,让你可以使用Impala或Hive进行表的创建、查询、加载数据等。
Impala的核心优势如下:
l Impala与现有的CDH生态系统集成,意味着data能通过CDH的不同手段进行存储、共享、访问。这也能避免数据储藏(avoid data silos)且最小化数据移动开销。
l Impala提供对CDH中数据的访问,而无需懂得MapReduce编程需要的Java技能。Impala能直接从HDFS中获取数据。Impala也能提供访问HBase数据库系统数据的SQL前端。
l Impala通常能在几分钟或者秒级时间内返回结果,而不像hive查询需要数十分钟或者数个小时。
l Impala首创使用Parquet文件格式,它是一种面向数据仓库大规模查询优化的列存储格式。
Impala提供针对HDFS、HBase数据的快速、交互式查询。与Hive相比,除了使用相同的统一存储平台外,Impala也使用相同的元数据、SQL语法、ODBC驱动和用户界面Hue。这样就为实时或批处理查询提供了统一的平台。
Impala提供了:
l 熟悉的SQL界面;
l 在Hadoop上进行交互查询的能力;
l 在集群环境中进行分布式查询,便于扩展和使用廉价机器;
l 在不同组件上无需copy、export/import而进行数据共享的能力,比如用Pig写—impala读,或者用impala写—Hive读;
l 针对大数据处理和分析的单系统,客户可以避免在modeling和ETL上的开销;
下图展示了Impala在Cloudera环境中的位置:
Impala由以下组件构成:
l Clients:Hue,ODBC客户端,JDBC客户端,impala shell都可以和impala交互。这些接口通常用于提交query或者完成管理任务,比如连接到impala;
l Hiver Metastore:关于可访问数据的存储信息。例如,metastore可以让impala知道哪些数据库可用以及它们的结构。当你执行create,drop,alter schema objects,load data into tables等其他SQL语句,相关的元数据metadata变化自动广播给所有的impala nodes,这是通过catalog service实现的(impala 1.2引入);
l Cloudera Impala:这个进程,运行在DataNodes上,协调并执行query。每个impala实体可以receive,plan,coordinate query from impala client。查询被分发到impala nodes上,这些节点像worker一样,执行并行的查询片段;
l HBase和HDFS:存储待查询的data;
Imala查询执行的流程:
1、 用户应用通过ODBC,JDBC发送SQL查询给Impala。用户应用可以连接到任何一个impalad节点,该impalad节点成为这个query的协调者;
2、 Impala解析query,分析并决定impalad实体需要执行什么tasks。执行会针对优化效率进行plan;
3、 Impalad实体访问本地HBase,HDFS服务获取数据;
4、 每个impalad返回数据给协调者impalad,协调者返回result给client;
Impala支持:
l Hive Query语言的大部分常见特征,如select,joins和聚集函数;
l HDFS和HBase存储,包含:
HDFS文件格式:Text file,SequenceFile,RCFile,Avro file,Parquet;
压缩编码:Snappy,GZIP,Deflate,BZIP;
l 常见的Hive接口:
JDBC driver;
ODBC driver;
Hue Beeswax,和新的impala query UI;
l Impala命令行接口;
l Kerberos授权;
Impalaserver是一个分布式的,大规模并行处理(MPP)的数据库引擎。它包括不同的守护进程,运行在CDH集群中特定的主机上。各个components如下:
这是ImpalaServer的核心组件,即运行在集群每个node上的impalad守护进程。它负责读写数据文件,接受impala-shell、Hue、JDBC、ODBC传来的query,对查询进行并行化处理,并分发work给集群的每个节点,传递中间结果给协调者节点。
你可以查询给任何一个impalad节点,该节点变为协调者节点。其他节点传递部分结果给协调者,协调者构建最终结果。在实际中,为了负载均衡,你可以提交不同查询给不同的impalad节点。
Impalad进程会与statestore进行通信,确认哪些节点是健康的,可以接受新的work。
每当任何impala节点创建,修改,删除任何类型的对象或者插入,加载数据通过impala执行时,所有的Impalad都会收到catalogd守护进程发来的广播消息。
Statestore组件检查impalad的健康状况,并不断传递它的发现给每个impalad。它由一个statestored守护进程代表,仅仅需要运行在集群的一个节点上。如果一个impala节点掉线了,statestore通知所有其他节点以便未来的查询可以避免向该坏节点发送请求。
由于statestore的目的是在出错时提供帮助,故它对于impala集群正常操作并不重要。如果statestore停止了或者变的不可达了,其他节点会继续运行,继续分发work;只是集群变的不太健壮了,试想如果有节点在statestore掉线后失效。当statestore恢复正常后,它再次和其他节点建立通信,并恢复它的监控功能。
Catalogservice组件在所有节点中传递metadata的变化。它由catalogd进程代表,仅需要运行在一个节点上。由于请求是通过statestore进程传递的,故通常把statestored进程和catalogd进程运行在同一个节点上。
该组件取代了对REFRESH和INVALIDATEMETADATA语句的需求。通常,如果你发出CREATE DATABASE, DROP DATABASE, CREATE TABLE, ALTER TABLE, 或者DROP TABLE语句执行,你需要在其他任何一个节点上执行INVALIDATE METADATA,以便你能获取到最新的改变。类似地,如果你在一个节点上进行INSERT操作,那么你需要在其他节点执行REFRESH table_name,才能进行query。Catalog service是你不在需要这么做,但是前提是你的更新语句是在impala上执行的,如果是在hive中执行的,那么你仍然需要在某一个impala节点(不需要在所有的impala节点上)上执行REFRESH, INVALIDATE操作。
默认情况下,启动时metadata加载和缓存是异步进行的,故impala可以立即接受request。如果想等待metadata加载完毕在接受查询,那么可以配置catalogd的启动参数--load_catalog_in_background=false。
Note:在impala 1.2.4或者更新版中,在hive中创建一个新的table后,你可以给INVALIDATEMETADATA加上table name参数,这样可以只更新该表的元数据,而不必重新加载所有的元数据。
Impala的核心开发语言是SQL。你也可以使用Java或者其他语言通过JDBC,ODBC与impala交互。对于特定类型的分析,你可以提供自己编写的UDF函数。
ImpalaSQL语言从HiveQL演化而来。目前,Impala SQL支持HiveQL语句、数据类型、内建函数的一个子集。
对于来自传统数据库背景的人,下面的特征可能看起来很熟悉:
l Impala SQL集中于query,只包含很少的DML。没有UPDATE和DELETE语句。过期数据通常被丢弃(通过DROP TABLE或者ALTER TABLE…DROP PARTITION语句)或者被替换(INSERTREPLACE语句);
l 所有的数据加载通过INSERT语句完成,通常是通过其他表的查询来大批量插入数据(insert data in bulk by querying from other tables)。有两个变种,INSERTINTO是插入到现有数据后面,INSERT OVERWRITE是替换一个table或者partition的全部内容(类似于TRUNCATE TABLE followed by a new INSERT)。没有INSERT …VALUES这种插入一行的用法;
l 通常构建table和数据文件在其他环境中,然后绑定impala以便进行实时查询。相同的数据文件和table元数据在Hadoop的不同组件中共享;
l 由于Hadoop和Impala集中于大数据上的数据仓库风格的操作,Impala SQL包含一些传统数据库系统导入数据的风格,如你可以创建一个table,它读取逗号分隔的文本文件,可以在CREATE TABLE语句中指定分隔符。你可以创建external table,读取已经存在的数据文件,但是无需移动转换;
l 由于impala读取大量的可能未经整理的或者不可预见的数据,故它没有对string数据类型强加长度限制。例如,你可以定义一个STRING类型的列,而不用CHAR(1)或者VARCHAR(64);
l 对于查询密集的应用,你会发现熟悉的 joins,built-in functions,用于处理string,number,date,aggregate function,subquery和比较操作符例如IN()和BETWEEN;
l 从数据仓库来看,你能发现这也有partitioned tables;
l 在impala 1.2或更高版本中,UDFs让你在SELECT和INSERT…SELECT语句中进行自定义的比较和转换逻辑;
你可以连接并提交查询给impalad通过:
l Impala-shell交互命令解释器;
l Apache Hue基于web的用户接口;
l JDBC
l ODBC
通过在非Linux平台上的JDBC,ODBC应用,你可以在异构环境中使用Impala。你也可以使用多种BI工具与Impala进行连接。
每个impalad守护进程运行在不同的节点,监听几个接受请求的端口。来自impala-shell和Hue的请求使用同一个端口到达impalad。Impalad为JDBC,ODBC请求监听不同的端口。
Impala利用许多Hadoop中熟悉的组件,它可以与其他Hadoop组件交换数据,既可以作为消费者也可以作为生产者,它可以灵活地融入你的ETL,ELT管道中。
impala一个主要的的目标就是使SQLon Hadoop足够快,有效率地适用于新类型用户并开辟Hadoop新的用例类型。实际上,它利用了已有的Hive框架,这是许多Hadoop用户已经执行长时间运行、面向批处理的SQL查询的平台。
特别地,Impala在传统的MySQL或者PostgreSQL中保存table定义,就是metastore,Hive也在相同的数据库中保存这类数据。因此,Impala能访问由Hive定义或加载过的table,只要所有的列使用Impala支持的数据类型、文件格式和压缩编码。
最初关注查询特征和性能意味着Impala用SELECT能读取的数据类型要比它用INSERT能写入的数据类型多。为了查询Avro,RCFile,SequenceFile文件格式,你可以使用Hive加载这类数据。
Impala查询优化器也能利用tablestatistics和cloumn statistics。原来使用ANALYZE TABLE在Hive中收集这类信息,在impala 1.2.2以后,使用impala的COMPUTE STATS语句替代,该语句需要的设置更少,更可靠更快,不需要在impala-shell和Hive shell中进行切换。
Impala利用metastore维护着table定义信息。Impala也跟踪数据文件低级特性的其他metadata:即HDFS中block的物理位置。
对于一个有大量数据and/or许多分区的table来说,获取所有的metadata可能很耗时。因此,每个impala节点缓存着所有这些元数据,便于针对这些表的未来查询重用这些元数据。
如果数据表或者其中的数据被更新,所有其他的impalad进程必须收到最新的元数据,以便在新的查询到来之前代替过时的缓存数据。在impala1.2之后,对于所有在impala中提交的DDL和DML语句的元数据更新是由catalogd进程协调自动进行的。
对于通过Hive提交的DDL和DML,或者HDFS中进行的手动更改,依然需要使用REFRESH(新数据加到现有table中)语句或者INVALIDATE METADATA(新建table,drop table,进行HDFS rebalance操作,删除数据文件)语句在impala中进行元数据刷新。执行INVALIDATE METADATA会自动获取metastore跟踪的所有table的元数据。如果你知道只有特定的table在impala之外被改变了,你可以使用REFRESH table_name只更新这些表的元数据。
Impala使用HDFS作为主要数据存储介质。Impala依赖HDFS提供的冗余机制来防止单节点的硬件或者网络中断。Impala表格数据时存放在HDFS中的数据文件,使用熟悉的HDFS文件格式和压缩编码。当某个目录中的数据文件提供给新的table,impala会读取该目录所有的数据,忽略文件名。新的数据被添加到有impala控制名字的文件中。
HBase也是impala可选的存储介质。它是建立在HDFS之上的数据库存储系统,没有内置的SQL支持。许多Hadoop用户已经用它存储大量数据,通过在impala中定义table并映射到HBase中等价的table,你可以通过Impala查询HBase的数据表内容,甚至进行同时包含Impala和HBase数据表的join查询。