Impala与Hive的比較
1. Impala架构
1所看到的,Impala主要由Impalad, State Store和CLI组成。

图 1
Store保持连接,用于确定哪个Impalad是健康和能够接受新的工作。在Impalad中启动三个ThriftServer: beeswax_server(连接client),hs2_server(借用Hive元数据), be_server(Impalad内部使用)和一个ImpalaServer服务。
Impala State Store: 跟踪集群中的Impalad的健康状态及位置信息,由statestored进程表示,它通过创建多个线程来处理Impalad的注冊订阅和与各Impalad保持心跳连接,各Impalad都会缓存一份State Store中的信息,当State Store离线后(Impalad发现State Store处于离线时,会进入recovery模式,重复注冊,当State
Store又一次添�集群后,自己主动恢复正常,更新缓存数据)由于Impalad有State Store的缓存仍然能够工作,但会由于有些Impalad失效了,而已缓存数据无法更新,导致把运行计划分配给了失效的Impalad,导致查询失败。
CLI: 提供给用户查询使用的命令行工具(Impala Shell使用python实现),同一时候Impala还提供了Hue,JDBC, ODBC使用接口。
2. 与Hive的关系

图 2
3. Impala的查询处理过程
使用round-robin算法)Coordinator::Exec对生成的运行计划树分配给对应的后端运行器Impalad运行(查询会使用LLVM进行代码生成,编译,运行。对于使用LLVM怎样提高性能这里有说明),通过调用GetNext()方法获取计算结果,假设是insert语句,则将计算结果通过libhdfs写回HDFS当全部输入数据被消耗光,运行结束,之后注销此次查询服务。
Impala的查询处理流程大概如图3所看到的:

图 3
PLAN FRAGMENT 0
PARTITION: UNPARTITIONED4:EXCHANGE
tuple ids: 1PLAN FRAGMENT 1
PARTITION: HASH_PARTITIONED: <slot 1>STREAM DATA SINK
EXCHANGE ID: 4
UNPARTITIONED3:AGGREGATE
| output: SUM(<slot 2>), SUM(<slot 3>)
| group by: <slot 1>
| tuple ids: 1
|
2:EXCHANGE
tuple ids: 1PLAN FRAGMENT 2
PARTITION: RANDOMSTREAM DATA SINK
EXCHANGE ID: 2
HASH_PARTITIONED: <slot 1>1:AGGREGATE
| output: SUM(id), COUNT(id)
| group by: id
| tuple ids: 1
|
0:SCAN HDFS
table=default.customer_small #partitions=1 size=193B
tuple ids: 0

图 4
4. Impala相对于Hive所使用的优化技术
5. Impala与Hive的异同
元数据:两者使用同样的元数据。
SQL解释处理:比較相似都是通过词法分析生成运行计划。
运行计划:
Hive: 依赖于MapReduce运行框架,运行计划分成map->shuffle->reduce->map->shuffle->reduce…的模型。假设一个Query会被编译成多轮MapReduce,则会有很多其它的写中间结果。因为MapReduce运行框架本身的特点,过多的中间过程会添加�整个Query的运行时间。
Impala: 把运行计划表现为一棵完整的运行计划树,能够更自然地分发运行计划到各个Impalad运行查询,而不用像Hive那样把它组合成管道型的map->reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。
数据流:
Hive: 採用推的方式,每个计算节点计算完毕后将数据主动推给兴许节点。
Impala: 採用拉的方式,兴许节点通过getNext主动向前面节点要数据,以此方式数据能够流式的返回给client,且仅仅要有1条数据被处理完,就能够马上展现出来,而不用等到所有处理完毕,更符合SQL交互式查询使用。
内存使用:
Hive: 在运行过程中假设内存放不下全部数据,则会使用外存,以保证Query能顺序运行完。每一轮MapReduce结束,中间结果也会写入HDFS中,相同因为MapReduce运行架构的特性,shuffle过程也会有写本地磁盘的操作。
Impala: 在遇到内存放不下数据时,当前版本号1.0.1是直接返回错误,而不会利用外存,以后版本号应该会进行改进。这使用得Impala眼下处理Query会受到一定的限制,不妨与Hive配合使用。Impala在多个阶段之间利用网络数据传输,在运行过程不会有写磁盘的操作(insert除外)。
调度:
Hive: 任务调度依赖于Hadoop的调度策略。
Impala: 调度由自己完毕,眼下仅仅有一种调度器simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器。调度器眼下还比較简单,在SimpleScheduler::GetBackend中能够看到,如今还没有考虑负载,网络IO状况等因素进行调度。但眼下Impala已经有对运行过程的性能统计分析,应该以后版本号会利用这些统计信息进行调度吧。
容错:
Hive: 依赖于Hadoop的容错能力。
Impala: 在查询过程中,没有容错逻辑,假设在运行过程中发生问题,则直接返回错误(这与Impala的设计有关,由于Impala定位于实时查询,一次查询失败,再查一次就好了,再查一次的成本非常低)。但从总体来看,Impala是能非常好的容错,全部的Impalad是对等的结构,用户能够向不论什么一个Impalad提交查询,假设一个Impalad失效,其上正在运行的全部Query都将失败,但用户能够又一次提交查询由其他Impalad取代运行,不会影响服务。对于State Store眼下仅仅有一个,但当State Store失效,也不会影响服务,每一个Impalad都缓存了State
Store的信息,仅仅是不能再更新集群状态,有可能会把运行任务分配给已经失效的Impalad运行,导致本次Query失败。
适用面:
Hive: 复杂的批处理查询任务,数据转换任务。
Impala:实时数据分析,由于不支持UDF,能处理的问题域有一定的限制,与Hive配合使用,对Hive的结果数据集进行实时分析。
6. Impala的优缺点
长处:
- 支持SQL查询,高速查询大数据。
- 能够对已有数据进行查询,降低数据的载入,转换。
- 多种存储格式能够选择(Parquet, Text, Avro, RCFile, SequeenceFile)。
- 能够与Hive配合使用。
缺点:
- 不支持用户定义函数UDF。
- 不支持text域的全文搜索。
- 不支持Transforms。
- 不支持查询期的容错。
- 对内存要求高。
Impala与Hive的比較的更多相关文章
- [转]impala操作hive数据实例
https://blog.csdn.net/wiborgite/article/details/78813342 背景说明: 基于CHD quick VM环境,在一个VM中同时包含了HDFS.YARN ...
- impala与hive的比较以及impala的有缺点
最近读的几篇关于impala的文章,这篇良心不错:https://www.biaodianfu.com/impala.html(本文截取部分内容) Impala是Cloudera公司主导开发的新型查询 ...
- 【转载】Impala和Hive的区别
Impala和Hive的关系 Impala是基于Hive的大数据实时分析查询引擎,直接使用Hive的元数据库Metadata,意味着impala元数据都存储在Hive的metastore中.并且im ...
- Impala与Hive的比较
1. Impala架构 Impala是Cloudera在受到Google的Dremel启发下开发的实时交互SQL大数据查询工具,Impala没有再使用缓慢的Hive+MapReduce批 ...
- Impala和Hive的关系(详解)
Impala和Hive的关系 Impala是基于Hive的大数据实时分析查询引擎,直接使用Hive的元数据库Metadata,意味着impala元数据都存储在Hive的metastore中.并且im ...
- Impala与Hive的优缺点和异同
定位: HIVE:长时间的批处理查询分析 impala:实时交互式SQL查询 impala优缺点优点: 1. 生成执行计划树,不用多次启动job造成多余开销,并且减少中间结果数据写入磁盘,执行速度快 ...
- 求解:为什么impala实现hive查询 可以使用ifnull()函数,不可以使用length() 函数
求大神解惑,找了很久都没有找到为什么??? hive支持length() 函数,不支持ifnull()函数??? impala实现hive查询 支持ifnull()函数,不支持length() 函数 ...
- 使用impala连接hive踩坑过程
一.打包镜像出错 docker build总是出错,如果你用的是python3.7,可以考虑使用python3.6版本 并且注意:选择thrift-sasl==0.2.1,否则会出现: Attribu ...
- hadoop生态系统学习之路(八)hbase与hive的数据同步以及hive与impala的数据同步
在之前的博文中提到,hive的表数据是能够同步到impala中去的. 一般impala是提供实时查询操作的,像比較耗时的入库操作我们能够使用hive.然后再将数据同步到impala中.另外,我们也能够 ...
随机推荐
- Mybatis分页插件PageHelper正确的用法(网上有2篇不够科学的文章)
今天下午在Mybatis项目中.实现分页.由于我是后加入项目中的,Leader用的是PageHelper这个组件.可是我在实际使用的过程中遇到了2个大问题. 1.p=2#comments" ...
- 自定义seekbar中,thumb被覆盖掉一部分问题
- c#利用VM_COPYDATA实现进程间通信
c#进程间的通信方式很多种,只会这种,感觉比较简单.不懂原理,能用就行. 假设有两个程序:server(主进程),client(子进程) 1.server端: /*定义一个结构体,用来接收从子进程传过 ...
- 转载:android——eclipse如何去除Ctrl+shift+R组合键查找到的.class文件
转载自:http://blog.csdn.net/virgilli/article/details/22500409 AS里面的build文件下一堆的.class 文件,当你要定位资源文件的时候,有些 ...
- Javascript高级程序设计读书笔记(第六章)
第6章 面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新 ...
- javascript紧接上一张for循环的问题,我自己的理解
这类问题,通常都是在for循环里,根据i的变化作为dom的下标来作当前dom的点击事件, 预期是,每个点击事件都对应相应的i下标,但是问题是,每次点击的都是最后一次节点的dom. 原因就是其实我们作点 ...
- silverlight visifire控件图表制作——silverlight 后台方法打印
一.后台方法 1.添加引用:using System.Windows.Printing; 2.全局变量://定义图片和文本打印变量 PrintDocument printImage; 3.构造方法体 ...
- silverlight+wcf 获得web参数
可以由wcf直接得到参数 ,具体代码如下: using System;using System.Linq;using System.Runtime.Serialization;using System ...
- UIAlertController的创建以及添加
个人还是更喜欢以前的UIAlertView的创建方法,更新后的UIAlertController虽然说将UIAlertView和UIActionSheet的功能和作用以一种模块化替换的方式来代替,但是 ...
- WCF相关
1.WCF初探-1:认识WCF(概览)2.WCF初探-2:手动实现WCF程序3.WCF精通系列4.无废话WCF系列教程