Impala 基于hive的交互式实时分析工具(二) 概念及原理介绍

impala和hive的区别

  • 概括:
    hive是【基于hadoop】的适合【离线批处理复杂sql分析的数仓工具】,
    impala是【基于hive】的适合【实时交互简单sql的数仓工具】

  • 执行计划
    1.hive: hive是底层将sql转化为mapreduce代码提交yarn执行,java底层
    2.impala: impala是底层将sql生成执行计划树,由c++执行集去执行

  • 数据流
    1.hive采用的是推的模式,即前一个节点计算完成之后,才统一把数据推给后一个节点
    2.impala采用的是拉的模式,即前一个节点处理完一点数据,后一点立马实时拉取结果

  • 内存的使用
    1.hive使用内存加外存并存模式
    2.impala只使用内存,若内存不足,会报错
    <解释>: mr程序中,若内存不足,可以使用虚拟内存(机器内存或硬盘),而impala只能使用物理内存

  • 调度
    1.hive使用yarn的调度机制
    2.impala使用自己的simple suchdule

  • 容错
    1.hive依赖hadoop的容错机制,例如task重试,推测执行机制
    2.imapala没有容错,sql执行瞬时,试错成本低

  • 适用面
    1.hive支持复杂场景的sql查询,支持自定义udf,udtf,udaf
    2.impala只支持简单场景的sql查询,不支持udtf函数

  • 架构
    1.hive是一个普通的类客户端程序
    2.impala是一个分布式计算引擎

  • 发行方
    1.hive是由facebook公司研发的
    2.impala是由cloudera公司研发的

SQL执行流程

  1. impala-server去impala-statestore上注册和订阅
  2. client提交查询到impala-server上,该节点负责调度,职责变为coordinator
  3. coordinator去catalog上获取元数据,获取数据hdfs地址,datanode信息
  4. coordinator的frontend-server根据元数据解析sql,并生成执行计划,然后分发给impala-server执行
  5. coordinator汇聚查询结果并返回给client

聚集函数执行流程

和topn类似,先对本地数据进行分组聚合以降低数据量,然后汇总之前的聚集结果再计算来得出最终结果

Join方式

  1. 表广播方式(broadcast join): 保持一个表的数据不动,将另一个表广播到所有相关节点.类似于map join
  2. hash重分布方式(partitioned join): 根据join字段hash值重新分布两张hash表数据.类似于smb join

注意函数使用

impala支持C++与Java的UDF和UDAF,不支持UDTF
impala中要用java开发UDF与Hive的开发是一致的
可以直接将Hive中写的 UDF在Impala中创建函数

元数据

  • 内容:
    impala和hive共用一套元数据,通过catalog来连接metastore服务
    hiveclient需要连接hiveserver2.然后连接metastore服务获取元数据
    impala不需要连接hiveserver2
  • 补充:
    1.每一台impalaserver都缓存了catalog中的元数据信息
    2.每一台impalaserver会缓存所有机器状态
    3.impalaserver与statestore保持心跳连接,statestore将所有节点的存活状态随着心跳的返回一起发送给impalaserver
  • 补充: impalaserver缓存catalog元数据信息及statestore节点可用列表,数据位置信息的优点
    1.减轻catalog和statestore的压力,不用频繁请求
    2.如果catalog和statestore节点不可用,集群还可用一段时间,因此statestore不需要HA,故障重启就ok
  • 流程:
    impalaserver提交修改操作,本次修改操作提交到catalog,然后提交给hive的metastore去修改数仓的元数据,metastore修改成功后返回本次被修改的元数据信息给catalog,catalog然后再同步此次修改元数据给对应的impalaserver,impalaserver接收到此次修改元数据信息后,在下一次心跳时,将此次修改元数据信息同步给statestore服务,statestore然后再将此次被修改的元数据信息同步给所有的impalaserver节点

短路读取

  • 概念:
    short-circuit local read短路读取,本地优先计算,将计算资源本地化,避免大数据量的网络传输
    若对应机器上没有数据或impala服务,那么就会使用机架感知,进行资源就近读取,
    若资源位置距离相同,则进行随机轮询读取

  • 例如:
    1.datanode与nodemanager同节点部署
    2.impalad与datanode同节点部署
    3.hregionserver与datanode同节点部署

查询性能实现

  1. 采取性能优化措施有向量的执行计划树
  2. 一次处理一个getnext一批记录
  3. 多个操作符可以做pipeline
  4. LLVM编译执行
  5. cpu密集型查询
  6. io本地化
  7. 支持本地优先计算,短路读取功能
  8. 支持列式存储格式,文件parquet列存

性能优化

  1. 短路机制:强制开启
  2. 保证Impalad与DN放在一台机器:优先本地计算
  3. 选择合适的列式文件存储和压缩
  4. 最推荐使用parquet类型存储
  5. 选择合适的分区粒度:一般来说impala中每个分区的数据不建议超过10G
  6. catalog与metastore放在一台机器上

你可能感兴趣的:(Impala 基于hive的交互式实时分析工具(二) 概念及原理介绍)