1.impala基本介绍
impala是cloudera提供的一款高效率的sql查询工具,提供实时的查询效果,官方测试性能比hive快10到100倍,其sql查询比sparkSQL还要更加快速,号称是当前大数据领域最快的查询sql工具。impala是参照谷歌的新三篇论文(Caffeine--网络搜索引擎、Pregel--分布式图计算、Dremel--交互式分析工具)当中的Dremel实现而来,其中旧三篇论文分别是(BigTable,GFS,MapReduce)分别对应我们即将学的HBase和已经学过的HDFS以及MapReduce。
impala是基于hive并使用内存进行计算,兼顾数据仓库,具有实时,批处理,多并发等优点
Impala下载官网:
Impala
2.Impala与hive的关系
impala是基于hive的大数据分析查询引擎,直接使用hive的元数据库metastore,意味着impala元数据都存储在hive的metastore当中,并且impala兼容hive的绝大多数sql语法。所以需要安装impala的话,必须先保证hive安装成功,并且还需要启动hive的metastore服务。
Hive元数据包含用Hive创建的database、table等元信息。元数据存储在关系型数据库中,如Derby、MySQL等。
客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可
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启动时间。
- Impala使用的优化技术
-
- 使用LLVM产生运行代码,针对特定查询生成特定代码,同时使用Inline的方式减少函数调用的开销,加快执行效率。(C++特性)
- 充分利用可用的硬件指令(SSE4.2)。
- 更好的IO调度,Impala知道数据块所在的磁盘位置能够更好的利用多磁盘的优势,同时Impala支持直接数据块读取和本地代码计算checksum。
- 通过选择合适数据存储格式可以得到最好性能(Impala支持多种存储格式)。
- 最大使用内存,中间结果不写磁盘,及时通过网络以stream的方式传递。
- 执行计划
-
- Hive: 依赖于MapReduce执行框架,执行计划分成 map->shuffle->reduce->map->shuffle->reduce…的模型。如果一个Query会 被编译成多轮MapReduce,则会有更多的写中间结果。由于MapReduce执行框架本身的特点,过多的中间过程会增加整个Query的执行时间。
- Impala: 把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询,而不用像Hive那样把它组合成管道型的 map->reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。
- 数据流
-
- Hive: 采用推的方式,每一个计算节点计算完成后将数据主动推给后续节点。
- Impala: 采用拉的方式,后续节点通过getNext主动向前面节点要数据,以此方式数据可以流式的返回给客户端,且只要有1条数据被处理完,就可以立即展现出来,而不用等到全部处理完成,更符合SQL交互式查询使用
- 内存使用
-
- Hive: 在执行过程中如果内存放不下所有数据,则会使用外存,以保证Query能顺序执行完。每一轮MapReduce结束,中间结果也会写入HDFS中,同样由于MapReduce执行架构的特性,shuffle过程也会有写本地磁盘的操作。
- Impala: 在遇到内存放不下数据时,版本1.0.1是直接返回错误,而不会利用外存,以后版本应该会进行改进。这使得Impala目前处理Query会受到一定的限制,最好还是与Hive配合使用
- 调度
-
- Hive: 任务调度依赖于Hadoop的调度策略。
- Impala: 调度由自己完成,目前只有一种调度器simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器。调度器 目前还比较简单,在SimpleScheduler::GetBackend中可以看到,现在还没有考虑负载,网络IO状况等因素进行调度。但目前 Impala已经有对执行过程的性能统计分析,应该以后版本会利用这些统计信息进行调度。
- 容错
-
- Hive: 依赖于Hadoop的容错能力。
- Impala: 在查询过程中,没有容错逻辑,如果在执行过程中发生故障,则直接返回错误(这与Impala的设计有关,因为Impala定位于实时查询,一次查询失败, 再查一次就好了,再查一次的成本很低)。
- 适用面
-
- Hive: 复杂的批处理查询任务,数据转换任务。
- Impala:实时数据分析,因为不支持UDF,能处理的问题域有一定的限制,与Hive配合使用,对Hive的结果数据集进行实时分析
4.Impala的优缺点
1)优点
- 基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销。
- 无需转换为Mapreduce,直接访问存储在HDFS,HBase中的数据进行作业调度,速度快。
- 使用了支持Data locality(数据本地化)的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销。
- 支持各种文件格式,如TEXTFILE 、SEQUENCEFILE 、RCFile、Parquet。
- 可以访问hive的metastore,对hive数据直接做数据分析。
2)缺点
- 对内存的依赖大,且完全依赖于hive。
- 实践中,分区超过1万,性能严重下降。
- 只能读取文本文件,而不能直接读取自定义二进制文件。
- 每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新。
5.Impala支持的文件格式
Impala可以对Hadoop中大多数格式的文件进行查询。它能通过create table和insert的方式将一部分格式的数据加载到table中,但值得注意的是,有一些格式的数据它是无法写入的(write to)。对于Impala无法写入的数据格式,我们只能通过Hive建表,通过Hive进行数据的写入,然后使用Impala来对这些保存好的数据执行查询操作。
文件类型 | 文件格式 | 压缩编码 | 能否Create? | 能否Insert? |
Parquet | 结构化 | Snappy、GZIP | 能 | 能 |
Text | 非结构化 | LZO | 能。 如果建表时没有指定存储类型,默认采用未压缩的text,字段由ASCII编码的0x01字符串分割 | 能 如果使用了LZO压缩,则只能通过Hive建表和插入数据。 |
Avro | 结构化 | Snappy GZIP Deflate BZIP2 | 在Impala 1.4.0 或者更高的版本上支持,之前的版本只能通过Hive来建表。 | 不能 只能通过LOAD DATA的方式将已经转换好格式的数据加载进去,或者使用Hive来插入数据 |
RCFile | 结构化 | Snappy GZIP Deflate BZIP2 | 能 | 不能 只能通过LOAD DATA的方式将已经转换好格式的数据加载进去,或者使用Hive来插入数据 |
SequenceFile | 结构化 | Snappy GZIP Deflate BZIP2 | 能 | 不能 只能通过LOAD DATA的方式将已经转换好格式的数据加载进去,或者使用Hive来插入数据 |
Impala支持以下压缩编码:
- Snappy – 推荐的编码,因为它在压缩率和解压速度之间有很好的平衡性,Snappy压缩速度很快,但是不如GZIP那样能节约更多的存储空间。Impala不支持Snappy压缩的text file
- GZIP – 压缩比很高能节约很多存储空间,Impala不支持GZIP压缩的text file
- Deflate – Impala不支持GZIP压缩的text file
- BZIP2 - Impala不支持BZIP2压缩的text file
- LZO – 只用于text file,Impala可以查询LZO压缩的text格式数据表,但是不支持insert数据,只能通过Hive来完成数据的insert
6.Impala的架构
Impala是Cloudera在受到Google的Dremel启发下开发的实时交互SQL大数据查询工具(实时SQL查询引擎Impala),通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query ExecEngine三部分组成),可以直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,从而大大降低了延迟。
Impala由三个服务组成:impalad, statestored, catalogd。
- Impalad: 与DataNode运行在同一节点上,由Impalad进程表示,一个datanode对应一个impalad,它接收客户端的查询请求(接收查询请求的Impalad为Coordinator,Coordinator通过JNI调用java前端解释SQL查询语句,生成查询计划树,再通过调度器把执行计划分发给具有相应数据的其它Impalad进行执行),读写数据,并行执行查询,并把结果通过网络流式的传送回给Coordinator,由Coordinator返回给客户端。同时Impalad也与State Store保持连接,用于确定哪个Impalad是健康和可以接受新的工作。在Impalad中启动三个ThriftServer: beeswax_server(连接客户端),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,导致查询失败。
- Catalogd作为metadata访问网关,从Hive Metastore等外部catalog中获取元数据信息,放到impala自己的catalog结构中。impalad执行ddl命令时通过catalogd由其代为执行,该更新则由statestored广播。
- CLI: 提供给用户查询使用的命令行工具(Impala Shell使用python实现),同时Impala还提供了Hue,JDBC, ODBC使用接口
7.Impapla如何执行查询
Impala执行的查询有以下几个步骤:
第一步:客户端通过ODBC、JDBC、或者Impala shell向Impala集群中的任意节点发送SQL语句,这个节点的impalad实例作为这个查询的协调器(coordinator)
第二步:Impala解析和分析这个查询语句来决定集群中的哪个impalad实例来执行某个任务,HDFS和HBase给本地的impalad实例提供数据访问
第三步:各个impalad向协调器impalad返回数据,然后由协调器impalad向client发送结果集
8.下载:
可以直接在原来我们安装好的CDH(建议提前拍好快照)安装Impala
在已安装好Hadoop,hive的基础上
打开CDH虚拟机,之后访问网址http://192.168.204.132:7180/cmf/login
通过以下命令访问impala页面:
impala-shell
21000是impala交互的端口
可以通过下面的链接来访问Impala的监护管理页面:
• 查看StateStore
http://192.168.204.132:25020/
• 查看Catalog
http://192.168.204.132:25010/
9.代码练习
展示所有数据库:show databases;
创建数据库: create database yhbd;
使用数据库:use yhbd;
展示数据库中所有的表:show tables;创建表:create table student(id int, name string) row format delimited fields terminated by '\t';先将文件上传到HDFS上
[root@CDH home]# hdfs dfs -put /home/student.txt /home/impala
然后加载数据
[CDH:21000] yhbd> load data inpath "/home/impala/student.txt" into table student;
如出现以下问题:
创建用户:
给用户赋予root权限:
[root@CDH ~]# vim /etc/sudoers
[root@CDH ~]# cat /etc/sudoers
[root@CDH ~]# chmod +w /etc/sudoers
[root@CDH ~]# vi /etc/sudoers
[root@CDH ~]# su liuyan #登录用户
[liuyan@CDH root]$ hadoop fs -chmod 777 /
chmod: changing permissions of '/': Permission denied. user=liuyan is not the owner of inode=/
[liuyan@CDH root]$ hdfs dfs -mkdir -p /home/impala
[liuyan@CDH root]$ hadoop fs -chmod 777 /home/impala因为Impala使用impala用户操作hdfs 所以没有权限 (hadoop操作用户是使用 hdfs 通过 hdfs dfs -ls / 查看)
系统使用hdfs超级用户登录修改 /home/impala 目录的拥有者是 impala重新上传并加载数据
[root@CDH ~]# hdfs dfs -put /home/student.txt /home/impala[CDH:21000] yhbd> load data inpath "/home/impala/student.txt" into table student;
Query: load data inpath "/home/impala/student.txt" into table student
+----------------------------------------------------------+
| summary |
+----------------------------------------------------------+
| Loaded 1 file(s). Total files in destination location: 1 |
+----------------------------------------------------------+
Fetched 1 row(s) in 0.74s
[CDH:21000] yhbd> select * from student;
useradd xiaoliu 创建普通用户
passwd xiaoliiu 设置密码超级管理员切换到普通用户:su xiaoliiu
退出普通用户: exit;
impala教程:
impala 环境_w3cschool