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执行流程
- impala-server去impala-statestore上注册和订阅
- client提交查询到impala-server上,该节点负责调度,职责变为coordinator
- coordinator去catalog上获取元数据,获取数据hdfs地址,datanode信息
- coordinator的frontend-server根据元数据解析sql,并生成执行计划,然后分发给impala-server执行
- coordinator汇聚查询结果并返回给client
聚集函数执行流程
和topn类似,先对本地数据进行分组聚合以降低数据量,然后汇总之前的聚集结果再计算来得出最终结果
Join方式
- 表广播方式(broadcast join): 保持一个表的数据不动,将另一个表广播到所有相关节点.类似于map join
- 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同节点部署
查询性能实现
- 采取性能优化措施有向量的执行计划树
- 一次处理一个getnext一批记录
- 多个操作符可以做pipeline
- LLVM编译执行
- cpu密集型查询
- io本地化
- 支持本地优先计算,短路读取功能
- 支持列式存储格式,文件parquet列存
性能优化
- 短路机制:强制开启
- 保证Impalad与DN放在一台机器:优先本地计算
- 选择合适的列式文件存储和压缩
- 最推荐使用parquet类型存储
- 选择合适的分区粒度:一般来说impala中每个分区的数据不建议超过10G
- catalog与metastore放在一台机器上