1、压缩(默认是Snappy)
是否压缩需要根据具体场景而定,如果需要压缩推荐使用Snappy。压缩的好处在于HDFS上存储更少,以及在执行broadcast的时候网络传输更少的数据,但要解压缩需要带来额外的CPU开销。如果执行的SQL本身是CPU密集型的,压缩未必合适。
不使用压缩:
set compression_codec=none;
使用GZIP压缩:
set compression_codec=gzip;
查看参数值:
set;
2、计算统计信息compute stats
计算统计信息后,一些简单的聚合计算,比如max( )、count( ),都可以根据与计算的结果快速响应。另外,Impala在计算Query Plan时也会利用统计信息,比如对join的顺序进行自动优化。需要注意的是这种自动“优化”可能带来性能的下降。
计算统计信息的示例:
compute stats table_name;
3、HDFS 缓存
HDFS允许将常用数据锁(LOCK)在内存中,以提高数据读取的效率。使用HDFS缓存时也要考虑权衡(Tradeoff)。毕竟这部分内存会被锁住,使得这部分内存无法在Impala计算过程中被使用。
使用HDFS Cache示例:
sudo -u hdfs hdfs cacheadmin -addPool impala_pool -owner impala -limit 3000000000
alter table table_name set cached in 'impala_pool';
alter table table_name set uncached;
4、保持join顺序
默认情况下compute stats会对join的顺序进行自动优化,但是这个自动“优化”未必会对所有SQL带来性能的提升。对于那些性能下降的SQL,可以使用straight_join保证Impala在计算Query Plan保持原有的join顺序。
使用straight_join示例:
select straight_join a.cloumn1, b.cloumn2 from table_name a inner join table_name2 b where a.cloumn1 = b.cloumn1;
5、SQL Hint指定join方式
SQL join 过程中涉及到数据的网络传输,Impala支持两种模式:broadcast 和 shuffle。Impala会根据表的大小选择合适的模式。
使用Hint示例:
select a.cloumn1, a.cloumn2 from table_name a join [ shuffle | broadcast ] table_name2 b where a.cloumn1 = b.cloumn1;
6、Impala设置并发度
在Cloudera Manager界面点击“集群”中的资源管理下的“动态资源池”,如下图:
然后点击“配置”可以看到已有的资源池,可以进行编辑,点击“Impala”可以修改“最大运行查询”和“最大队列查询”等。