• Impala源代码分析---1


    2、Impala源代码分析

    參考链接:http://www.sizeofvoid.net/wp-content/uploads/ImpalaIntroduction2.pdf

    本章開始进入源代码分析阶段,參考链接是一篇很好的impala实现、执行流程介绍的文档,感谢作者。

    2.1 Impala内部架构

             Impala内部架构图例如以下:

    图2-1 Impala内部架构

             从图中能够看出,Impala三个部分:client、Impalad、StateStore的关系。

     

    组件

    说明

    Client

    图中能够看到有三种,是Thriftclient,用来提交查询,连接到Impalad的21000port

    Impalad

    有frontEnd和backEnd两部分,包含三个Thrift Server(beeswax-server、hs2-server、be-server)

    StateStore

    各个impalad向其注冊,然后它向各个impalad更新集群中其它节点的状态

     

    以下介绍一下Impalad组件的各个port,例如以下表:

     

    属性

    说明

     

    Impalad组件port

    Impala 后台程序后端port 
    be_port

    22000

    默认值

    ImpalaBackendService 导出的port。

    Impala Daemon Beeswax port 
    beeswax_port

    21000

    默认值

    Impala Daemon Beeswaxclient请求提供服务所使用的port。

    Impala Daemon HiveServer2 port 
    hs2_port

    21050

    默认值

    Impala Daemon HiveServer2client请求提供服务所使用的port。

    StateStoreSubscriber 服务port 
    state_store_subscriber_port

    23000

    默认值

    StateStoreSubscriberService 执行的port。

     

     

     

     

    StateStore组件port

     

    StateStore 服务port 
    state_store_port

    24000

    默认值

    StateStoreService 导出的port。

    StateStore HTTP serverport 
    webserver_port

    25010

    默认值

    StateStore 调试站点server执行的port。

     

             当中beeswax_port=21000是用来给Beeswaxclient提供服务的port,比方图中的Hueclient、JDBC、Impala-shell三种client都会使用这个port;hs2_port=21050是用来给HiveServer2client提供服务的;be_port=22000是用来与内部的其它Impalad进程交互的port;state_store_subscriber_port=23000是用来向StateStated进程注冊自己和更新状态用的port;而StateStore组件里的24000port正是用来与Impalad的23000port进行交互的,其它port不太重要,不做介绍。

             总体的代码文件结构例如以下:

    2.2 Impalad代码分析

    2.2.1 Impalad-main.cc


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

    待续。。。

  • 相关阅读:
    无法直接启动带有"类库输出类型"的项目解...
    基于.NET的免费开源的模板引擎---VTemplate(转)
    用户 'IIS APPPOOLDefaultAppPool' 登录失败。
    如何获得配置文件中,连接数据库的连接字符串
    如何获取数据库的链接字符串
    IIS运行.NET4.0配置
    Repeater用法
    asp.net三层架构详解
    C#本地时间转Unix时间
    C#Timer
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4299977.html
Copyright © 2020-2023  润新知