分享

Impala源码分析---1

xioaxu790 2014-9-16 21:55:08 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 11510
本帖最后由 xioaxu790 于 2014-9-16 21:57 编辑
问题导读
1、 Impala内部架构由哪些组成,是什么关系?


2、Impalad组件的各个端口代表什么含义?




2、Impala源码分析
本章开始进入源码分析阶段,参考链接是一篇非常好的impala实现、运行流程介绍的文档,感谢作者。

2.1 Impala内部架构
Impala内部架构

         从表中可以看出,Impala三个部分:client、Impalad、StateStore的关系。

  
组件
  
说明
Client
图中可以看到有三种,是Thrift客户端,用来提交查询,连接到Impalad21000端口
Impalad
frontEndbackEnd两部分,包括三个Thrift Serverbeeswax-serverhs2-serverbe-server
StateStore
各个impalad向其注册,然后它向各个impalad更新集群中其他节点的状态




下面介绍一下Impalad组件的各个端口,如下表:
  
属性
  
说明

Impalad组件端口

Impala 后台程序后端端口
  be_port
22000
  
默认值
ImpalaBackendService 导出的端口。
Impala Daemon Beeswax 端口
  beeswax_port
21000
  
默认值
Impala Daemon Beeswax 客户端请求提供服务所使用的端口。
Impala Daemon HiveServer2 端口
  hs2_port
21050
  
默认值
Impala Daemon HiveServer2 客户端请求提供服务所使用的端口。
StateStoreSubscriber 服务端口
  state_store_subscriber_port
23000
  
默认值
StateStoreSubscriberService 运行的端口。




StateStore组件端口

StateStore 服务端口
  state_store_port
24000
  
默认值
StateStoreService 导出的端口。
StateStore HTTP 服务器端口
  webserver_port
25010
  
默认值
StateStore 调试网站服务器运行的端口。


         其中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
  1. // This file contains the main() function for the impala daemon process,  
  2. // which exports the Thrift services ImpalaService and ImpalaInternalService.  
  3.    
  4. #include <unistd.h>  
  5. #include <jni.h>  
  6.    
  7. #include "common/logging.h"  
  8. #include "common/init.h"  
  9. #include "exec/hbase-table-scanner.h"  
  10. #include "exec/hbase-table-writer.h"  
  11. #include "runtime/hbase-table-factory.h"  
  12. #include "codegen/llvm-codegen.h"  
  13. #include "common/status.h"  
  14. #include "runtime/coordinator.h"  
  15. #include "runtime/exec-env.h"  
  16. #include "util/jni-util.h"  
  17. #include "util/network-util.h"  
  18. #include "rpc/thrift-util.h"  
  19. #include "rpc/thrift-server.h"  
  20. #include "rpc/rpc-trace.h"  
  21. #include "service/impala-server.h"  
  22. #include "service/fe-support.h"  
  23. #include "gen-cpp/ImpalaService.h"  
  24. #include "gen-cpp/ImpalaInternalService.h"  
  25. #include "util/impalad-metrics.h"  
  26. #include "util/thread.h"  
  27.    
  28. using namespace impala;  
  29. using namespace std;  
  30.    
  31. DECLARE_string(classpath);  
  32. DECLARE_bool(use_statestore);  
  33. DECLARE_int32(beeswax_port);  
  34. DECLARE_int32(hs2_port);  
  35. DECLARE_int32(be_port);  
  36. DECLARE_string(principal);  
  37.    
  38. int main(int argc, char** argv) {  
  39.    InitCommonRuntime(argc, argv, true);    //参数解析,开启日志,基于Google gflags和glog  
  40.    
  41.    LlvmCodeGen::InitializeLlvm();  
  42.    JniUtil::InitLibhdfs();      //初始化JNI,因为Fe部分是java开发的  
  43.    EXIT_IF_ERROR(HBaseTableScanner::Init());  
  44.    EXIT_IF_ERROR(HBaseTableFactory::Init());  
  45.    EXIT_IF_ERROR(HBaseTableWriter::InitJNI());  
  46.   InitFeSupport();  
  47.    
  48.    // start backend service for the coordinator on be_port  
  49.    ExecEnv exec_env;  //ExecEnv是query/paln-fragment的执行环境  
  50. StartThreadInstrumentation(exec_env.metrics(), exec_env.webserver());  
  51.   InitRpcEventTracing(exec_env.webserver());  
  52.    
  53.   ThriftServer* beeswax_server = NULL;  
  54.    ThriftServer* hs2_server = NULL;  
  55.   ThriftServer* be_server = NULL;     //这是三个ThriftServer,原来服务client和其他impalad backend  
  56.    ImpalaServer* server = NULL;     //此server将上面三个ThriftServer包装起来对外提供服务  
  57.   EXIT_IF_ERROR(CreateImpalaServer(&exec_env, FLAGS_beeswax_port, FLAGS_hs2_port,  
  58.        FLAGS_be_port, &beeswax_server, &hs2_server, &be_server, &server));    //创建ImpalaServer  
  59.   
  60.   EXIT_IF_ERROR(be_server->Start());      //启动be_server  
  61.   
  62.    Status status = exec_env.StartServices();   //启动service,包括statestore_subscriber (用来向statestod进程注册)  
  63.   if (!status.ok()) {  
  64.     LOG(ERROR) << "Impalad services did not start correctly, exiting.  Error: "  
  65.                << status.GetErrorMsg();  
  66.    ShutdownLogging();  
  67.      exit(1);  
  68.   }  
  69.   
  70.    // this blocks until the beeswax and hs2 servers terminate  
  71.    EXIT_IF_ERROR(beeswax_server->Start());  
  72.   EXIT_IF_ERROR(hs2_server->Start());  
  73.   ImpaladMetrics::IMPALA_SERVER_READY->Update(true);  
  74.    LOG(INFO) << "Impala has started.";  
  75.   beeswax_server->Join();       //阻塞等待beeswax-server退出才执行后面的语句  
  76.    hs2_server->Join();         //阻塞等待hs2-server退出才继续执行后面语句  
  77.    
  78.    delete be_server;  
  79.    delete beeswax_server;  
  80.    delete hs2_server;  
  81. }
复制代码


待续。。。


上一篇:Impala学习笔记


本文参考自这篇PDF文档:网盘下载ImpalaIntroduction2.pdf



没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条