大数据组件--Hive与Impala的异同
一、同
数据存储:使用相同的存储数据池都支持把数据存储于HDFS, HBase。
元数据:两者使用相同的元数据。
SQL语法:基本类似。
二、异
1)、底层运行使用的技术
hive底层默认使用mapreduce引擎进行执行计算,impala底层执行语言分为两种,前端使用的是Java,执行具体查询功能的后端使用的是C++编写的,针对特定查询生成特定代码,执行效率更高。
最大使用内存,中间结果不写磁盘,及时的通过网络以流式的方式进行传递
2)、执行计划
hive依赖于mapreduce执行框架,底层会分成map操作-shuffle-reduce操作-map操作-shuffle-reduce操作..的执行过程去执行,如果一个查询被编译成多个map、reduce操作,说明中间出现多次写磁盘的操作,增加执行时间。
impala是将执行计划表现为一个完整的执行计划树,可以将执行计划分发到每个impalad中执行查询,从而保证impala有更好的并发性,并且避免中间的排序和shuffle。
impala执行计划如图:
3)、数据流
hive采用的是推的方式,它是在数据节点上的数据都进行计算完毕后,将数据推给后面的节点。
impala采用的是拉的方式,后续节点通过getNext主动向前面节点要数据,一天处理完就可以立即展示,不用等所有的数据都完成才进行展示。
4)、内存使用
hive执行是内存不够会使用磁盘进行计算
impala只基于内存计算,内存放不下数据时,低版本的impala会报错误,可以调整参数来避免报错。impala在多个阶段之间利用网络传输数据,在执行过程不会有写磁盘的操作(insert除外)。
5)、调度
Hive: 任务调度依赖于Hadoop的yarn调度策略。
Impala: 调度由自己完成,目前只有一种调度器simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器,尽量能不用网络io的就不用。
6)、容错
Hive: 依赖于Hadoop的容错能力。
Impala: 在查询过程中,没有容错逻辑,如果在执行过程中发生故障,则直接返回错误(这与Impala的设计有关,因为Impala定位于实时查询,一次查询失败, 再查一次执行时间很短,成本低)。但从整体来看,Impala是能很好的容错,所有的Impalad是对等的结构,用户可以向任何一个 Impalad提交查询,如果一个Impalad失效,其上正在运行的所有Query都将失败,但用户可以重新提交查询由其它Impalad代替执行,不 会影响服务。对于State Store目前只有一个,但当State Store失效,也不会影响服务,每个Impalad都缓存了State Store的信息,只是不能再更新集群状态,有可能会把执行任务分配给已经失效的Impalad执行,导致本次Query失败。
7)、适用面
Hive: 复杂的批处理查询任务,数据转换任务。
Impala:实时数据分析,因为不支持UDF,能处理的问题域有一定的限制,与Hive配合使用,对Hive的结果数据集进行实时分析。