Impala简明调优手册
来源:互联网 发布:无人机单片机 编辑:程序博客网 时间:2024/06/16 18:49
Impala是Cloudera开发、开源的一个原生于Hadoop的交互式SQL引擎。本身Impala的出现并不是为了替代Hive、Pig等现有的、常用的ETL工具。实用的场景往往于商业智能密不可分,比如对数据进行聚合(Aggregation)、做一些简单的分析统计(比如window function),通过JDBC/ODBC,集成到当今流行的BI工具中,例如Tableau等等。
这篇博文主要来探讨下关于Impala日常使用过程中的需要注意的点,不得不强调的是对于SQL的运行,一方面我们的确需要关注SQL本身的执行性能,比如多久可以执行完毕;但是,SQL的并发更是一个关键的考察点,毕竟我相信对于大部分生产上的集群,用户不止一位,任务也不止一个。另外,随着服务器标配的内存数日益增长,128GB、256GB的机器屡见不鲜,对于如何更加高效使用CPU会成为下一个热点 (CPU Efficiency)。
这一步一般是默认需要做的,在Impala中,定义Parquet格式数据表的示例:
create table test_parquet (
id int,
name string
)
stored as parquet
2. 不使用压缩
是否压缩需要根据具体的场景而定。如果压缩,推荐使用Snappy。压缩的好处在于HDFS上存储了更少的数据以及在SQL执行期间网络传输了更少的数据。但是解压缩往往带来额外的CPU开销。如果执行的SQL本身是CPU密集型的,压缩就可能未必合适了。在Impala中不使用压缩的示例:
set compression_codec=none;
3. 计算统计信息
计算统计信息后,一些简单的聚合计算,比如MAX(...)、COUNT(...),都可以根据预计算的结果快速相应。另外,Impala在计算Query Plan时也会利用这些统计信息,比如对JOIN顺序进行自动优化。需要注意的是这种自动“优化”并不一定100%带来性能的提升。在Impala中计算统计信息的示例:
compute stats test_parquet;
4. HDFS Cache
HDFS允许将常用数据LOCK在内存中,以提高数据读取的效率。使用HDFS Cache时也要考虑权衡。毕竟这部分内存会被LOCK住,使得这部分内存无法在Impala计算过程中使用。因此,这一特征的使用要慎重,建议在某一数据被非常频繁地读取时考虑使用。在Impala中,使用HDFS Cache的示例:
hdfs cacheadmin -addPool impala_pool -owner impala -limit 4000000000
create table test_parquet (
id int,
name string
)
stored as parquest;
alter table test_parquet set cached in 'impala_pool';
alter table test_parquet set uncached;
create table test_parquet (
id int,
name string
)
stored as parquest;
alter table test_parquet set cached in 'impala_pool';
alter table test_parquet set uncached;
5. 保持JOIN顺序
一般情况下,COMPUTE STATS会对JOIN的顺序进行自动优化。但是这个自动“优化”并不一定保证对所有的SQL都带来性能的提升 (需要测试)。对于那些性能下降的SQL,可以使用STRAIGHT_JOIN保证Impala在计算Query Plan保持原有的JOIN顺序。在Impala中,使用STRAIGHT_JOIN的示例:
select STRAIGHT_JOIN id, name
from test_parquet t inner join other_parquet o
on t.id = o.id
from test_parquet t inner join other_parquet o
on t.id = o.id
6. SQL Hint指定JOIN方式
SQL JOIN过程涉及数据的网络传输,Impala支持两种模式BROADCAST与SHUFFLE,Impala会根据表的大小选择合适的模式,如果需要显示指定特定模式,Impala可以使用Hint,示例如下:
select id, name
from test_parquet t join [SHUFFLE] other_parquet o
on t.id = o.id;
select id, name
from test_parquet t join [BROADCAST] other_parquet o
on t.id = o.id;
from test_parquet t join [SHUFFLE] other_parquet o
on t.id = o.id;
select id, name
from test_parquet t join [BROADCAST] other_parquet o
on t.id = o.id;
0 0
- Impala简明调优手册
- Impala性能调优
- Impala安装手册
- Impala原理及其调优
- junit使用简明手册
- EasyMock使用简明手册
- JunitPerf使用简明手册
- StrutsTest使用简明手册
- JCoverage使用简明手册
- Linux简明系统维护手册
- StrutsTest使用简明手册
- Log4j简明手册
- junit使用简明手册
- Log4j简明手册
- Log4j简明手册
- Log4j简明手册
- Log4j简明手册
- EasyMock使用简明手册
- 《coredump问题原理探究》Linux x86版7.1节vector对象
- poj 1830 高斯消元模版题
- C++多态技术
- Codeforces 513G1 or 513G2 Inversions problem DP
- ps学习(一)
- Impala简明调优手册
- 在Mini2440上移植RT3070驱动+wpa_supplicant调通
- PHPcms --资料
- virtualbox 虚拟机上网配置
- Android Xposed 参考
- 黑马程序员_Java_GUI
- 2014年总结——回眸过去
- 例题10-8 密码 UVa1262
- 第一次在csdn写博客。