Impala 简介以及与 Hive 的异同
1. Impala 基本介绍
impala 是 cloudera 提供的一款高效率的 sql 查询工具,提供实时的查询效果,官方测试性能比 hive 快 10 到 100 倍,其 sql 查询比 sparkSQL 还要更加快速,号称是当前大数据领域最快的查询 sql 工具,
impala 是参照谷歌的新三篇论文(Caffeine--网络搜索引擎、Pregel--分布式图计算、Dremel--交互式分析工具)当中的 Dremel 实现而来,其中旧三篇论文分别是(BigTable,GFS,MapReduce)分别对应我们即将学的 HBase 和已经学过的 HDFS 以及 MapReduce。
impala 是基于 hive 并使用内存进行计算,兼顾数据仓库,具有实时,批处理,多并发等优点。
2. Impala 与 Hive 关系
impala 是基于 hive 的大数据分析查询引擎,直接使用 hive 的元数据库 metadata,意味着 impala 元数据都存储在 hive 的 metastore 当中,并且 impala 兼容 hive 的绝大多数 sql 语法。所以需要安装 impala 的话,必须先安装 hive,保证 hive 安装成功,并且还需要启动 hive 的 metastore 服务。
Hive 元数据包含用 Hive 创建的 database、table 等元信息。元数据存储在关系型数据库中,如 Derby、MySQL 等。
客户端连接 metastore 服务,metastore 再去连接 MySQL 数据库来存取元数据。有了 metastore 服务,就可以有多个客户端同时连接,而且这些客户端不需要知道 MySQL 数据库的用户名和密码,只需要连接 metastore 服务即可。
nohup hive --service metastore >> ~/metastore.log 2>&1 &
Hive 适合于长时间的批处理查询分析,而 Impala 适合于实时交互式 SQL 查询。可以先使用 hive 进行数据转换处理,之后使用 Impala 在 Hive 处理后的结果数据集上进行快速的数据分析。
3. Impala 与 Hive 异同
Impala 与 Hive 都是构建在 Hadoop 之上的数据查询工具各有不同的侧重适应面,但从客户端使用来看 Impala 与 Hive 有很多的共同之处,如数据表元数据、ODBC/JDBC 驱动、SQL 语法、灵活的文件格式、存储资源池等。
但是 Impala 跟 Hive 最大的优化区别在于:没有使用 MapReduce 进行并行计算,虽然 MapReduce 是非常好的并行计算框架,但它更多的面向批处理模式,而不是面向交互式的 SQL 执行。与 MapReduce 相比,Impala 把整个查询分成一执行计划树,而不是一连串的 MapReduce 任务,在分发执行计划后,Impala 使用拉式获取数据的方式获取结果,把结果数据组成按执行树流式传递汇集,减少的了把中间结果写入磁盘的步骤,再从磁盘读取数据的开销。Impala 使用服务的方式避免每次执行查询都需要启动的开销,即相比 Hive 没了 MapReduce 启动时间。
3.1. Impala 使用的优化技术
使用 LLVM 产生运行代码,针对特定查询生成特定代码,同时使用 Inline 的方式减少函数调用的开销,加快执行效率。(C++特性)
充分利用可用的硬件指令(SSE4.2)。
更好的 IO 调度,Impala 知道数据块所在的磁盘位置能够更好的利用多磁盘的优势,同时 Impala 支持直接数据块读取和本地代码计算 checksum。
通过选择合适数据存储格式可以得到最好性能(Impala 支持多种存储格式)。
最大使用内存,中间结果不写磁盘,及时通过网络以 stream 的方式传递。
3.2. 执行计划
Hive: 依赖于 MapReduce 执行框架,执行计划分成 map->shuffle->reduce->map->shuffle->reduce…的模型。如果一个 Query 会 被编译成多轮 MapReduce,则会有更多的写中间结果。由于 MapReduce 执行框架本身的特点,过多的中间过程会增加整个 Query 的执行时间。
Impala: 把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个 Impalad 执行查询,而不用像 Hive 那样把它组合成管道型的 map->reduce 模式,以此保证 Impala 有更好的并发性和避免不必要的中间 sort 与 shuffle。
3.3. 内存使用
Hive: 在执行过程中如果内存放不下所有数据,则会使用外存,以保证 Query 能顺序执行完。每一轮 MapReduce 结束,中间结果也会写入 HDFS 中,同样由于 MapReduce 执行架构的特性,shuffle 过程也会有写本地磁盘的操作。
Impala: 在遇到内存放不下数据时,版本 1.0.1 是直接返回错误,而不会利用外存,以后版本应该会进行改进。这使用得 Impala 目前处理 Query 会受到一定的限制,最好还是与 Hive 配合使用。
3.4. 调度
Hive: 任务调度依赖于 Hadoop 的调度策略。
Impala: 调度由自己完成,目前只有一种调度器 simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器。调度器 目前还比较简单,在 SimpleScheduler::GetBackend 中可以看到,现在还没有考虑负载,网络 IO 状况等因素进行调度。但目前 Impala 已经有对执行过程的性能统计分析,应该以后版本会利用这些统计信息进行调度。
3.5. 容错
Hive: 依赖于 Hadoop 的容错能力。
Impala: 在查询过程中,没有容错逻辑,如果在执行过程中发生故障,则直接返回错误(这与 Impala 的设计有关,因为 Impala 定位于实时查询,一次查询失败, 再查一次就好了,再查一次的成本很低)。
3.6. 适用面
Hive: 复杂的批处理查询任务,数据转换任务。
Impala:实时数据分析,因为不支持 UDF(impala 1.2 开始支持 UDF),能处理的问题域有一定的限制,与 Hive 配合使用,对 Hive 的结果数据集进行实时分
版权声明: 本文为 InfoQ 作者【五分钟学大数据】的原创文章。
原文链接:【http://xie.infoq.cn/article/f6492a42461bc9935df57a210】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论