一.基本介绍
Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据。已有的Hive系统虽然也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性。相比之下,Impala的最大特点也是最大卖点就是它的快速。
优点
1. Impala不需要把中间结果写入磁盘,省掉了大量的I/O开销。
2. 省掉了MapReduce作业启动的开销。MapReduce启动task的速度很慢(默认每个心跳间隔是3秒钟),Impala直接通过相应的服务进程来进行作业调度,速度快了很多。
3. Impala完全抛弃了MapReduce这个不太适合做SQL查询的范式,而是像Dremel一样借鉴了MPP并行数据库的思想另起炉灶,因此可做更多的查询优化,从而省掉不必要的shuffle、sort等开销。
4. 通过使用LLVM来统一编译运行时代码,避免了为支持通用编译而带来的不必要开销。
5. 用C++实现,做了很多有针对性的硬件优化,例如使用SSE指令。
6. 使用了支持Data locality的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销。
二.安装过程
在CDH的主节点(139.0.31.80) 7180端口的界面上,直接添加impala 的服务就可以了
三.使用方法
添加了impala的服务之后,直接在主节点或者其他子节点上
直接输入 “impala-shell” 就可以进入impala的sql编写界面
之后就是 connect 在CDH里面有impala 的节点名称
“connect hadoop001”
再就是和 mysql一样,use ods ,show tables
四.Impala sql 和普通sql 的差异点
1. Impala是没有存储过程的概念的,直接把sql放入文件中调用执行
impala-shell -i hadoop001 -f + sql文件所在路径
hadoop001 是有impala服务的节点主机名
2. INVALIDATE METADATA;
Impala 在调用 hive的数据表之前要同步数据结构,hive数据做了修改之后是不会直接同步到impala的,需要手动同步
3. truncate bdasec.tb_cube_ztts_sjc_m; 正常是truncate table ,这里没有table
4. 在impala里面 字段的类型都是强制相同的,字符型和数值型是不能互相比较的
SATJ>='201201' 这种事必须加上 ‘’ 引号的
这时就出现了一个问题,ajzt>='2' 是会把‘100’ 剔除掉的,因为字符里面’2’>’100’
还有就是int型和bigint型也是不相同的
Cast( a as int) 如果a是浮点型,是不能转成int 的,会直接没有值不是会得到整数部分的值,所以必须是cast( a as float)
5. 在impala 里面是没有事务也不能update 和 delete
采用的方式是全覆盖,语法是insert overwrite
例如:
替换 update 的语句
(update t_test1 t inner join t_test2 t1
on t.sprt_year=t1.sprt_year+1
set t.last_year_value =t1.stats_value )
insert overwrite table t_test1
select t.sprt_year,
t.stats_value,ifnull(t1.stats_value,0) as last_year_value
from t_test1 t left join t_test2 t1
on cast(t.sprt_year as int)=cast(t1.sprt_year as int) +1
;
替换delete 语句
(delete from t_test1 where case_stats='001' )
insert overwrite table t_test1
select t.* from t_test1 t
where not exists (
select 1 from t_test1 t1
where t.sprt_year=t1.sprt_year
and t1.case_stats='001'
);
6. Impala 里面对group 是很严格的,除了汇总的项 其他的字段全部都要存在在group by 的后面 否者会报错
五.运行impala遇到的问题
1. impala Memory limit exceeded 解决办法
在页面 impala的配置里搜索 “Impala Daemon 内存限制”
更改内存的限制大小 一般按照内存的大小限制,尽量给大,因为impala是都在内存里计算,所以设定大一点的内存