impala的架构
无主模型,没有主从的概念
HiveMetaStore和HDFS NameNode是外部系统,StateStore和Catalog是impala的内部系统
Impala是一个长服务计算。而MapReduce是一个临时的计算,什么时候提交作业什么时候才会计算。
Spark:启动服务后一直计算知道所有计算结束,进程拉起后执行完所有计算任务才会销毁。
MapReduce:启动服务后执行作业的计算,计算结束后销毁进程。每个作业都会拉起和销毁一次进程。
Impala主要有Impalad、State Store 和CLI组成:
Impalad
与DataNode运行在同一节点上,由Impalad进程表示,它接收客户端的查询请求(接收查询请求的Impalad为Coordinator,Coordinator通过JNI [java native interface] 调用java前端解释SQL查询语句,生成查询计划树,再通过调度器把执行计划分发给具有相应数据的其它Impalad进行执行),读写数据,并行执行查询,并把结果通过网络流式的传送回给Coordinator,由Coordinator返回给客户端。同时Impalad也与State Store保持连接,用于确定哪个Impalad是健康和可以接受新的工作。在Impalad中启动三个ThriftServer: beeswax_server(连接客户端),hs2_server(借用Hive元数据), be_server(Impalad内部使用)和一个ImpalaServer服务。
每个impalad实例会接收、规划并调节来自ODBC或Impala Shell等客户端的查询。每个impalad实例会充当一个Worker,处理由其它impalad实例分发出来的查询片段(query fragments)。客户端可以随便连接到任意一个impalad实例,被连接的impalad实例将充当本次查询的协调者(Ordinator),将查询分发给集群内的其它impalad实例进行并行计算。当所有计算完毕时,其它各个impalad实例将会把各自的计算结果发送给充当 Ordinator的impalad实例,由这个Ordinator实例把结果返回给客户端。每个impalad进程可以处理多个并发请求。
Impalad的数量等于DataNode的数量
Imapla State Store
负责Query的调度及跟踪集群中的Impalad的健康状态及位置信息,由statestored进程表示,它通过创建多个线程来处理Impalad的注册订阅和与各Impalad保持心跳连接,各Impalad都会缓存一份State Store中的信息,当State Store离线后,因为Impalad有State Store的缓存仍然可以工作,但会因为有些Impalad失效了,而已缓存数据无法更新,导致把执行计划分配给了失效的Impalad,导致查询失败。Impalad发现State Store处于离线时,会进入recovery模式,反复注册,当State Store重新加入集群后,自动恢复正常,更新缓存数据。
当impalad启动之后,Statestore启动完成后,所有的Impalad都会和StateStore建立连接,这个连接不是必须的,在过程中可以断掉。StateStore中有一种类似于广播的机制,每一个impalad连过来之后,都会由StateStore把这个impalad的信息广播给其他和它建立连接的impalad,这样集群当中所有impalad内存当中都会有全局拓扑,所有impalad都知道集群中还有哪些节点及其主机和端口号。
Catalog
当Impala集群启动后,从Hive MetaStore中获取所有的元数据信息,全量的下载回来放到impala自己的catalog中。Catalog会与StateStore通信,将元数据信息通过StateStore广播到每个Impalad节点,这样每个impalad除了有全局拓扑的元数据之外,还有全量的hive中的meta store元数据(表的元数据),所以每个impalad都知道所有的信息。
同时当Impala客户端在某个Impalad中创建表后,Impalad也会将建表的元数据信息通过State Store通知给各个Impalad节点和Catalog,由Catalog同步到Hive的元数据(Meta Store相当于在为impala做元数据持久化)中。
这样,hive metastore、statestore,catelog这些节点宕机都没有关系,客户端可以随便连接任意一台Impalad来请求服务 。
但是Impala是在内存中的,掉电易失,在Impala中执行的SQL语句的日志statestore会将数据同步给catalog ,catalog会将数据持久化回hive metastore,hive会将元数据持久化到关系型数据库中。
如果是有用户在impala启动之后在Hive中建了新表,在Impala集群中是不会有这个新建的表的。那是因为元数据是趋向于稳定的,不会动态更新元数据信息。除非对集群中下发指令,指令下发给catalog,重新全量的从hive metastore中加载元数据并重新广播一次,这样才能看到hive中新增的表
在实际生产环境中,如果做增加表的操作,都会走一个测试的环节,测试成功才会变更工单,然后上线。上线的时候,Hive数据仓库会和Impala沟通,工单就会流到Impala这块,Impala会决定用不用新创建的这些表,用的话可以执行一个命令将元数据在Impala集群中再刷一遍即可。
注意 Hive中创建表产生的元数据信息,不能同步到catalog中,需要手动执行命令同步。
CLI(Impala shell)
命令行客户端,提供给用户查询使用的命令行工具。