我们都知道MapReduce在Google内部应用很广,社区有对应的MapReduce实现Hadoop。 但是Hadoop的MapReduce框架本身重点考虑高容量并发,具有很强的扩展能力和容错能力,但对任务的低延时考虑较少. 比如:
因此,Hadoop的MapReduce是一个批处理的系统,并不适合实时处理。
针对实时Adhoc查询,Google内部有Dremel,之所以Dremel能在大数据上实现交互性的响应速度,主要使用了两方面的技术:
google的Dremel不支持Join,而其Tenzing支持join,但是基于MapReduce,性能相对逊色。 由于Impala的架构师Marcel Kornacker从Google出来 [1] ,Impala的设计有可能反映了Google内部对Dremel和Tenzing的改进思想.
也因此,Impala不会完全替代Hive,Impala是Hive的一个补充,可以快速的响应一些简单的查询请求。
Impala是Cloudera开发并开放代码的一个MPP模型的实时海量数据的分布式查询引擎 (当前最新版本1.1). 该查询引擎主要针对“低延时的实时数据查询与分析”应用,支持直接访问HDFS(hive)和HBase中的数据。
Impala采用了和Hive相同的类SQL接口,但并没有采用MapRed框架执行任务,而是采用了类似Dremel的方式, 其实Impala就是自己实现了一个执行引擎。 这个引擎不像MapRed一样是一个通用框架,并且也没 有任何failover和high availability的设计.
Cloudera官方博客 上列举了:
另外,补充一些:
由于在分布式环境中,机器宕机是一种常态,如果一个大任务在执行过程中发生机器故障,重算整个JOB开销很大。 而Impala的设计理念就是,执行速度足够快,快到如果失败了,重新执行一遍的代价也不大。 也因此,Impala无法取代Hive,而且Impala扩展能力不如MapReduce框架。 当前只能**部署300台**左右,机器数目继续增加,慢节点和机器故障带来的问题就会比较突出,影响性能表现。
一个SQL执行过程如下:
在一个运行中的Impala系统中,主要包含两类服务进程:
交互流程:
目前StateStore还不提供对元数据的更新订阅,因此impalad的Meta缓存可能不是最新,必要时需要reflush下。 而且,目前来看StateStore的这些功能可以完全使用ZK来替代(需要statestore支持Query级的调度)
Impala的主要代码包含在三个目录中: