Impala 架构剖析
Impala 主要由 Impalad、 State Store、Catalogd 和 CLI 组成。
1. Impalad
Impalad:与 DataNode 运行在同一节点上,由 Impalad 进程表示,它接收客户端的查询请求(接收查询请求的 Impalad 为 Coordinator,Coordinator 通过 JNI 调用 java 前端解释 SQL 查询语句,生成查询计划树,再通过调度器把执行计划分发给具有相应数据的其它 Impalad 进行执行),读写数据,并行执行查询,并把结果通过网络流式的传送回给 Coordinator,由 Coordinator 返回给客户端。同时 Impalad 也与 State Store 保持连接,用于确定哪个 Impalad 是健康和可以接受新的工作。
在 Impalad 中启动三个 ThriftServer: beeswax_server(连接客户端),hs2_server(借用 Hive 元数据),be_server(Impalad 内部使用)和一个 ImpalaServer 服务。
2. Impala State Store
Impala State Store:跟踪集群中的 Impalad 的健康状态及位置信息,由 statestored 进程表示,它通过创建多个线程来处理 Impalad 的注册订阅和与各 Impalad 保持心跳连接,各 Impalad 都会缓存一份 State Store 中的信息,当 State Store 离线后(Impalad 发现 State Store 处于离线时,会进入 recovery 模式,反复注册,当 State Store 重新加入集群后,自动恢复正常,更新缓存数据)因为 Impalad 有 State Store 的缓存仍然可以工作,但会因为有些 Impalad 失效了,而已缓存数据无法更新,导致把执行计划分配给了失效的 Impalad,导致查询失败。
3. CLI
CLI: 提供给用户查询使用的命令行工具(Impala Shell 使用 python 实现),同时 Impala 还提供了 Hue,JDBC,ODBC 使用接口。
4. Catalogd
Catalogd:在 impala 中如果执行一条 sql 引起元数据变化,比如 create table xxx;此时 catalog 服务会把这些变化推送到其它 impalad 的节点上;Catalog 服务对应的进程名称为 catalogd;一个 impala 集群只需要一个 catalogd 进程;因为所有的请求都是通过 statestore 进程发送过来;所以我们要让 statestore 与 catalogd 进程运行在同一节点。
Impala 查询处理过程
Impalad 分为 Java 前端与 C++处理后端,接受客户端连接的 Impalad 即作为这次查询的 Coordinator,Coordinator 通过 JNI 调用 Java 前端对用户的查询 SQL 进行分析生成执行计划树。
Java 前端产生的执行计划树以 Thrift 数据格式返回给 C++后端(Coordinator)(执行计划分为多个阶段,每一个阶段叫做一个 PlanFragment,每一个 PlanFragment 在执行时可以由多个 Impalad 实例并行执行(有些 PlanFragment 只能由一个 Impalad 实例执行,如聚合操作),整个执行计划为一执行计划树)。
Coordinator 根据执行计划,数据存储信息(Impala 通过 libhdfs 与 HDFS 进行交互。通过 hdfsGetHosts 方法获得文件数据块所在节点的位置信息),通过调度器(现在只有 simple-scheduler,使用 round-robin 算法)Coordinator::Exec 对生成的执行计划树分配给相应的后端执行器 Impalad 执行(查询会使用 LLVM 进行代码生成,编译,执行),通过调用 GetNext()方法获取计算结果。
如果是 insert 语句,则将计算结果通过 libhdfs 写回 HDFS 当所有输入数据被消耗光,执行结束,之后注销此次查询服务。
版权声明: 本文为 InfoQ 作者【大数据技术指南】的原创文章。
原文链接:【http://xie.infoq.cn/article/92b97f0e6c97e6ed7ec6bf43a】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论