本帖最后由 xioaxu790 于 2014-9-16 21:57 编辑
问题导读
1、 Impala内部架构由哪些组成,是什么关系?
2、Impalad组件的各个端口代表什么含义?
2、Impala源码分析
本章开始进入源码分析阶段,参考链接是一篇非常好的impala实现、运行流程介绍的文档,感谢作者。
2.1 Impala内部架构
Impala内部架构
从表中可以看出,Impala三个部分:client、Impalad、StateStore的关系。
组件 | | | 图中可以看到有三种,是Thrift客户端,用来提交查询,连接到Impalad的21000端口 | | 有frontEnd和backEnd两部分,包括三个Thrift Server(beeswax-server、hs2-server、be-server) | | 各个impalad向其注册,然后它向各个impalad更新集群中其他节点的状态 |
下面介绍一下Impalad组件的各个端口,如下表:
属性 | | |
| |
| | | ImpalaBackendService 导出的端口。 | Impala Daemon Beeswax 端口
beeswax_port | | Impala Daemon 向 Beeswax 客户端请求提供服务所使用的端口。 | Impala Daemon HiveServer2 端口
hs2_port | | Impala Daemon 向 HiveServer2 客户端请求提供服务所使用的端口。 | StateStoreSubscriber 服务端口
state_store_subscriber_port | | StateStoreSubscriberService 运行的端口。 |
|
|
|
| |
| StateStore 服务端口
state_store_port | | | StateStore HTTP 服务器端口
webserver_port | | |
其中beeswax_port=21000是用来给Beeswax客户端提供服务的端口,比如图中的Hue客户端、JDBC、Impala-shell三种client都会使用这个端口;hs2_port=21050是用来给HiveServer2客户端提供服务的;be_port=22000是用来与内部的其他Impalad进程交互的端口;state_store_subscriber_port=23000是用来向StateStated进程注册自己和更新状态用的端口;而StateStore组件里的24000端口正是用来与Impalad的23000端口进行交互的,其他端口不太重要,不做介绍。
2.2 Impalad代码分析
2.2.1 Impalad-main.cc
- // This file contains the main() function for the impala daemon process,
- // which exports the Thrift services ImpalaService and ImpalaInternalService.
-
- #include <unistd.h>
- #include <jni.h>
-
- #include "common/logging.h"
- #include "common/init.h"
- #include "exec/hbase-table-scanner.h"
- #include "exec/hbase-table-writer.h"
- #include "runtime/hbase-table-factory.h"
- #include "codegen/llvm-codegen.h"
- #include "common/status.h"
- #include "runtime/coordinator.h"
- #include "runtime/exec-env.h"
- #include "util/jni-util.h"
- #include "util/network-util.h"
- #include "rpc/thrift-util.h"
- #include "rpc/thrift-server.h"
- #include "rpc/rpc-trace.h"
- #include "service/impala-server.h"
- #include "service/fe-support.h"
- #include "gen-cpp/ImpalaService.h"
- #include "gen-cpp/ImpalaInternalService.h"
- #include "util/impalad-metrics.h"
- #include "util/thread.h"
-
- using namespace impala;
- using namespace std;
-
- DECLARE_string(classpath);
- DECLARE_bool(use_statestore);
- DECLARE_int32(beeswax_port);
- DECLARE_int32(hs2_port);
- DECLARE_int32(be_port);
- DECLARE_string(principal);
-
- int main(int argc, char** argv) {
- InitCommonRuntime(argc, argv, true); //参数解析,开启日志,基于Google gflags和glog
-
- LlvmCodeGen::InitializeLlvm();
- JniUtil::InitLibhdfs(); //初始化JNI,因为Fe部分是java开发的
- EXIT_IF_ERROR(HBaseTableScanner::Init());
- EXIT_IF_ERROR(HBaseTableFactory::Init());
- EXIT_IF_ERROR(HBaseTableWriter::InitJNI());
- InitFeSupport();
-
- // start backend service for the coordinator on be_port
- ExecEnv exec_env; //ExecEnv是query/paln-fragment的执行环境
- StartThreadInstrumentation(exec_env.metrics(), exec_env.webserver());
- InitRpcEventTracing(exec_env.webserver());
-
- ThriftServer* beeswax_server = NULL;
- ThriftServer* hs2_server = NULL;
- ThriftServer* be_server = NULL; //这是三个ThriftServer,原来服务client和其他impalad backend
- ImpalaServer* server = NULL; //此server将上面三个ThriftServer包装起来对外提供服务
- EXIT_IF_ERROR(CreateImpalaServer(&exec_env, FLAGS_beeswax_port, FLAGS_hs2_port,
- FLAGS_be_port, &beeswax_server, &hs2_server, &be_server, &server)); //创建ImpalaServer
-
- EXIT_IF_ERROR(be_server->Start()); //启动be_server
-
- Status status = exec_env.StartServices(); //启动service,包括statestore_subscriber (用来向statestod进程注册)
- if (!status.ok()) {
- LOG(ERROR) << "Impalad services did not start correctly, exiting. Error: "
- << status.GetErrorMsg();
- ShutdownLogging();
- exit(1);
- }
-
- // this blocks until the beeswax and hs2 servers terminate
- EXIT_IF_ERROR(beeswax_server->Start());
- EXIT_IF_ERROR(hs2_server->Start());
- ImpaladMetrics::IMPALA_SERVER_READY->Update(true);
- LOG(INFO) << "Impala has started.";
- beeswax_server->Join(); //阻塞等待beeswax-server退出才执行后面的语句
- hs2_server->Join(); //阻塞等待hs2-server退出才继续执行后面语句
-
- delete be_server;
- delete beeswax_server;
- delete hs2_server;
- }
复制代码
待续。。。
上一篇:Impala学习笔记
本文参考自这篇PDF文档:网盘下载ImpalaIntroduction2.pdf
|