Impala学习--Impala系统架构

Impala系统架构

http://blog.cloudera.com/blog/wp-content/uploads/2012/10/impala.png

上图中,黄色部分谓Imapla模块,蓝色部分为运行Impala依赖的其他模块。

从部署上看,Impala整体分为两部分:

  • StateStore
  • Impalad

其中StateStore是一个集群状态服务进程。在集群中只存在一个实例。Impalad是分布式的存在于集群中的worker进程。每一个Impalad又包含了以下部分:

  • StateStoreSubscriber:订阅StateStore状态
  • Scheduler:调度器
  • Analyzer:对提交的Query进行语法分析
  • Planner:生成执行计划
  • Coordinator:管理一个Query的执行,包括分发给其他Impalad执行
  • PlanFragmentExecutor:执行一个PlanFragment

同时,Impala依赖的外部系统包括:

  • HDFS/HBase:用于读取查询数据
  • HDFS NameNode:用于检查输入数据位置
  • Hive MetaStore:用于访问表的元数据

整体流程:

  1. 客户端向某一个Impalad提交一个query
  2. Impalad通过jni,将query传送给java前端,由java前端完成语法分析和生成执行计划,并将执行计划封装成thrift格式返回执行计划分为多个阶段,每一个阶段叫做一个PlanFragment,每一个PlanFragment在执行时可以由多个Impalad实例并行执行(有些PlanFragment只能由一个Impalad实例执行)
  3. Coordinator根据执行计划,访问Scheduler,完成调度,并将任务分发给远端的Impalad执行
  4. 用户调用GetNext()方法获取计算结果,如果是insert语句,则将计算结果写回hdfs
  5. 当所有输入数据被消耗光,执行结束。
  6. 在执行过程中,如果有任何故障发生,则整个执行失败

这个流程与Hive相比,编译和生成执行计划阶段比较相似,但是执行阶段有很大不同:

  • 执行计划

    Hive依赖于MapRed执行框架,执行计划被严格划分成Map->Shuffle->Red->Map->Shuffle->Red…的模型。如果一个Qurey会被编译成多轮MapRed,则每一轮结束都会存在一个barrier。此外,如果Hive中有两个可以并行的子查询,且分组的key不相同,则需要两个独立的MapRed任务才能完成。这个问题在Impala中不存在。

    Impala的执行计划是一刻完整的树(DAG),不受任何约束,这个执行计划和Dryad的DAG模型很相像。这个执行计划中,只有在必要的时候才会出现barrier,例如group,top等。其他的计算都是流式的。前面算子的计算结果,可以立即被后面算子消耗。

  • 数据流

    Hive的数据流采用推的方式,每一各计算节点计算完成后将数据主动下推给后续节点。

    Impala采用拖的方式,后续节点主动向前面节点要数据。拖的方式的特点在于,数据可以流式的返回给客户端,只要有1条数据被处理完成,就可以立即展现出来。

  • 外存使用

    Hive执行过程中,如果内存放不下所有数据,则会利用外存,以保证query能顺利执行完。每一轮MapRed结束,中间结果也会写入hdfs中。由于Hadoop框架的限制,shuffle过程也会有写本地磁盘的操作。

    Impala在遇到内存放不下数据时,则直接返回错误,而不会利用外存。这使得Impala目前能处理的Query可能收到一定的限制。例如在做聚合操作,或join时,可能因为内存不够而失败。同时Impala在多个阶段之间利用网络传输数据。总的来说,Impala执行过程中,不会有任何写磁盘操作(除非用户制定insert命令)

  • 调度

    Hive任务的调度依赖于Hadoop的调度策略。

    Impala的调度由自己完成,目前的调度算法会尽量满足数据的局部性,即扫描数据的进程应尽量靠近数据本身所在的物理机器。但目前调度暂时还没有考虑负载均衡的问题。从Cloudera的资料看,Impala程序的瓶颈是网络IO,目前Impala中已经存在对Impalad机器网络吞吐进行统计,但目前还没有利用统计结果进行调度。

  • 容错

    Hive任务依赖于Hadoop框架的容错能力,可以做到很好的failover。

    Impala中不存在任何容错逻辑,如果执行过程中发生故障,则直接返回错误。当一个Impalad失败时,在这个Impalad上正在运行的所有query都将失败。但由于Impalad是对等的,用户可以向其他Impalad提交query,不影响服务。当StateStore失败时,也不会影响服务,但由于Impalad已经不能再更新集群状态,如果此时有其他Impalad失败,则无法及时发现。这样调度时,如果谓一个已经失效的Impalad调度了一个任务,则整个query无法执行。

Author: <kyle@localhost.localdomain>

Date: 2013-02-19 10:22:08 CST

HTML generated by org-mode 6.21b in emacs 23

展开阅读全文

没有更多推荐了,返回首页