1 代码结构

  • service: 连接前端,并接受client的请求
  • runtime: 运行时需要的类,包括coordinator, datastream, mem-pool, tuple等
  • exec: ExecNode,执行节点
  • expr: 表达式求值
  • transport: Thrift SASL: Simple Authentication and Security Layer
  • statestore: 调度,nameservice,资源池
  • codegen: 代码生成

2 StateStore

StateStore是一个C/S结构的信息订阅服务,在Impala里面,主要用于管理当前集群的membership状态,并用于调度和发现故障进程。StateStore是一个独立的进程,每一各impalad会建立一个或多个于StateStore的连接。

StateStore提供四个接口:

  • RegisterService:向某个服务进行注册,就是加入并成为这个服务的成员
  • UnregisterService:取消在某个服务的注册
  • RegisterSubscription:订阅某一各服务的成员信息
  • UnregisterSubscription:取消对某个服务成员信息的注册

StateStore会通过心跳来检查已经注册的成员是否还活着,判断条件可以是心跳超时,连续丢失n个心跳。StateStore定期向subscriber更新其所订阅服务的成员信息。目前的更新策略是全量更新,未来会考虑增量更新。通常在Impala集群中只存在一个服务,每个impalad都会注册这个服务。注册服务后,这个impalad就可以对其他impalad可见,这样就可以接受其他impalad发来的任务。

3 Scheduler

Coordinator在得到执行计划后,通过Scheduler得到可以执行的后端,并向这些后端发送执行命令

Scheduler提供两个接口

  • GetHosts:提供一组访问数据所在的机器地址,返回一组和数据尽量接近的机器地址
  • GetAllKnownHosts:返回所有还存活的机器地址。

SimpleScheduler是目前唯一的Scheduler的实现。Coordinator通过调用SimpleScheduler的GetHosts方法,调度和远端任务分配。在GetHosts方法中,采用的算法是:优先寻找已经和数据位置相同的后端,如果没有相同的,则采用roud-robin算法。目前SimpleScheduler没有考虑机器实时的负载情况。返回的后端数目取决于输入数据分布的机器数目。

4 impalad启动流程

  • 初始化LLVM,hdfs,jni,hbase,前端
  • 启动ImpalaServer
  • 启动thriftserver,接受thrift请求
  • 启动ExecEnv
    • 启动webserver
    • 启动SubscriptionManager
    • 启动Scheduler
      • 向StateStore订阅,并注册回调函数SimpleScheduler::UpdateMembership,用于调度时提供当前可用的后端
  • SubscriptionManager::RegisterService
    • StateStore检查service是否存在,如果不存在,则建立一个新的service_instance
    • 检查客户端是否存在于这个service_instance的membership中,如果不存在,则添加一个
  • SubscriptionMangaer::RegisterSubscription
    • StateStore添加一个Subscriber,订阅这个service的membership,并注册回调函数MembershipCallback
    • 当有update回调时,更新impala-server的membership状态,用于failure detector

Impalad启动后,就可以接受query请求,也可以接受其他impalad的请求,执行一个PlanFragment。

5 Coordinator

负责执行一组PlanFragments。同时负责响应client的请求。coordinator fragment在本地执行,其他发送到远程的impalad执行。coordinator同时监控整个执行状态。

Exec()函数是其最主要的函数,简要介绍一下这个函数中的流程::

  • ComputeFragementExecParams():

    • ComputeFragmentHosts():对于每一个Fragment,根据输入数据所在的节点,调用Scheduler的GetHosts方法,得到每个阶段在那些后端上执行
    • 对于每一个Fragment,计算其ExchangeNode的参数
  • ComputeScanRangeAssignment():计算每一个后端应该扫描多少数据。
  • executor_ = new PlanFragmentExecutor()创建一个新的PlanFragmentExecutor。
  • executor_->Prepare()
  • 对于每一各fragment,对于每一个远程后端,调用ExecRemoteFragment。
  • ProgressUpdater:定期更新状态。

6 ExecNode

所有ExecNode的父类。主要方法有Prepare(), Open(), GetNext(), Close(), CreateTree()ExecNode是真正在Impalad上处理数据的类,包括hash-join,聚合,scan等等。多个ExecNode组成了一颗执行树。root节点被最后执行,叶子节点被最先执行。

Impala中的执行顺序和Hive中相反。在Impala中,采用拖的方式,而Hive中采用推的方式。Impala中,执行入口是根节点的Open方法。Open方法会调用孩子节点的Open方法和GetNext方法。

主要数据结构包括:

  • ObjectPool* pool_
  • vector<Expr*> conjuncts_
  • vector<ExecNode*> children_
  • RowDescriptor row_descriptor_

主要函数包括:

  • Prepare()在Open前被调用。code generation
  • Open()在GetNext前被调用,准备工作。调用孩子节点的GetNext()
  • GetNext()返回一组row,并标记eos
  • EvalConjuncts()对所有表达式进行求值,并返回布尔结果

7 PlanFragmentExecutor

执行一个PlanFragment。包括初始化和清理。清理包括释放资源,关闭data stream。每一个Executor会有一个callback,用于汇报执行状态。

最主要的有三个函数,分别是:

  • Status Prepare(TExecPlanFragmentParams):准备执行,主要流程如下:

    • DescriptorTbl::Create():初始化descriptor table.
    • ExecNode::CreateTree():初始化执行树。执行树由ExecNode组成。每一个ExecNode也提供了Prepare(), Open(), GetNext()三个函数。初始化完成后,plan_指向了执行树的根节点。
    • plan_->Prepare():初始化执行树
    • 如果可以使用代码生成,则调用runtime_state_->llvm_codegen()->OptimizedModule()进行优化
    • set scan ranges
    • set up sink, if required
    • set up profile counter
  • Status Open():开始执行,并启动一个独立的线程向coordinator汇报状态:
    • plan_->Open()从根节点开始调用Open函数,开始执行。
    • if has sink: sink_->Send()如果有写回操作,例如query中包含insert语句,则主动将计算结果推送到hdfs或hbase中。
  • Status GetNext(RowBatch)用于触发执行树的GetNext函数。当GetNext返回done时,则表明所有数据已经被处理完,Executor可以退出了。

Author: <kyle@localhost.localdomain>

Date: 2013-02-25 17:44:34 CST

HTML generated by org-mode 6.21b in emacs 23

 

Impala学习–Impala后端代码分析的更多相关文章

  1. 学习《精通数据科学从线性回归到深度学习》PDF+代码分析

    数据科学内容广泛,涉及到统计分析.机器学习以及计算机科学三方面的知识和技能.学习数据科学,推荐学习<精通数据科学从线性回归到深度学习>. 针对技术书籍,最好的阅读方法是对照每一章的示例代码 ...

  2. 【impala学习之一】impala

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 CM5.4 一.ImpalaImpala是基于Hive的大数 ...

  3. 20155207 《网络对抗》exp4 恶意代码分析 学习总结

    20155207 <网络对抗> 恶意代码分析 学习总结 实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件 ...

  4. 开源项目kcws代码分析--基于深度学习的分词技术

    http://blog.csdn.net/pirage/article/details/53424544 分词原理 本小节内容参考待字闺中的两篇博文: 97.5%准确率的深度学习中文分词(字嵌入+Bi ...

  5. impala学习笔记

    impala学习笔记 -- 建库 CREATE DATABASE IF NOT EXISTS database_name; -- 在HDFS文件系统中创建数据库,需要指定要创建数据库的位置. CREA ...

  6. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  7. 一致性哈希算法学习及JAVA代码实现分析

    1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...

  8. 【impala学习之二】impala 使用

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 CM5.4 一.Impala shell 1.进入impal ...

  9. ISD9160学习笔记05_ISD9160语音识别代码分析

    前言 语音识别是特别酷的功能,ISD9160的核心卖点就是这个语音识别,使用了Cybron VR 算法. 很好奇这颗10块钱以内的IC是如何实现人家百来块钱的方案.且听如下分析. 本文作者twowin ...

随机推荐

  1. 关于BufferefReader.readLine()方法的理解

    有以下代码:    BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in)); String ...

  2. hdu 1877

    题目 一个进制转换的题,注意0+0的情况 代码如下: #include <cstdio> int d[1000]; void solve(int n,int base) { int p = ...

  3. hdu 5035 指数分布无后效性

    http://acm.hdu.edu.cn/showproblem.php?pid=5035 n个柜台每个柜台服务的时间都满足指数分布t=p(k),求min(p(k)+t)的期望 指数分布一个有趣的特 ...

  4. spring集成struts2

    Struts2前身是WebWork,核心并没有改变,其实就是把WebWork改名为struts2,与Struts1一点关系没有. Struts2中通过ObjectFactory接口实现创建及获取Act ...

  5. SQL语句小tips(持续更新)

    统计非法数据 判断people_id是否是32为字母组成的,统计不满足要求的数据 SELECT COUNT(IF(BINARY people_id NOT REGEXP '^[0-9a-z]{32}' ...

  6. CS中窗体的基类(BaseForm)注意点

    窗体基类最好新建一个窗体(BaseForm) 1.这样能够保证在VS中保证他的派生窗口也能够可视化. 2.如果基类直接是一个cs类文件,对于处理派生窗口就很复杂,比如按钮权限之类的操作; 如果直接继承 ...

  7. C# 基础篇

    全篇依据 C#高级编程(第9版) 内容记录: 基础知识C# 5.0 基础 分为15章内容来介绍 核心C# 对象和类型 继承 泛型 数组 运算符和类型强制转换 委托和lambda表达式,事件 字符串和正 ...

  8. event 自定义事件

    自定义事件 1 public class Program 2 { 3 public event EventHandler ehdl=null; 4 public Program() 5 { 6 ehd ...

  9. openstack 虚机迁移 Unacceptable CPU info: CPU doesn't have compatibility

    问题: Unacceptable CPU info: CPU doesn't have compatibility 解决: vim /usr/lib/python2.7/site-packages/n ...

  10. 初识面向对象-封装、property装饰器、staticmathod(静态的方法)、classmethod(类方法) (五)

    封装 # class Room:# def __init__(self,name,length,width):# self.__name = name# self.__length = length# ...