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. 网络中路由器相关的名词理解LAN,WAN,WLAN

    1. LAN,全称Local Area Network,中文名叫做局域网. LAN是指在某一区域内由多台计算机互联成的计算机组.一般是方圆几千米以内. 局域网可以实现文件管理.应用软件共享.打印机共享 ...

  2. What if you are involved in an automobile accident in the US

    What if you are involved in an automobile accident in the US With increasing Chinese tourists and vi ...

  3. delphi存取图片

    1.存图片到数据库 var   PicStream: TMemoryStream; if imgBugPic.Picture.Graphic <> nil then  begin    P ...

  4. 导出delphi编写的ios程序在xcode下的日志

  5. vim基本命令速查表

    来源:https://github.com/skywind3000/awesome-cheatsheets/blob/master/editors/vim.txt ################## ...

  6. Pipelines - .NET中的新IO API指引(三) 边看边记

    Pipelines - .NET中的新IO API指引 作者 marcgravell  原文 此系列前两篇网上已有的译文 Pipelines - .NET中的新IO API指引(一) Pipeline ...

  7. .net下使用最小堆实现TopN算法

    测试代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...

  8. python 使用dir() help() 查看一个对象所有拥有的方法和属性

    可以使用python 的内置方法 dir() 或者help() 查看 某个对象所拥有的方法和属性, 二者间的区别是: dir() : 只是得到方法或者属性的名称 help():不但可以得到对象的方法和 ...

  9. jzoj5875

    這玩意嚴格意義上算是水法(因為可能會被卡) 題目中,如果按照一般的bfs來搜索,那麼有平方級邊,會tle 如果按照補邊的線性來搜索,那麼時間複雜度變為min(k*k,m)*n,視n,m同階,則時間複雜 ...

  10. js面试题-数组去重

    今天,在聊天群里看到数组去重的话题,面试者的答案如下: 参考答案如下: 程序员思维,做出如下测试: 未考虑到:1,‘1’是不同的,应该不去重 未考虑到对象 所以,参考答案只能去重基础类型 根据以往看过 ...