
# Impala应用开发建议
#### Coordinator和Executor分离部署，Coordinator根据集群规模部署2-5个
Coordinator承担缓存元数据，解析SQL执行计划，和响应客户端请求的功能主要使用jvm内存，而Executor承担数据读写，算子计算等功能，主要使用offheap内存；拆分后可有效提升内存使用率；另外，所有的SQL执行统计均在Coordinator中记录，分离后可通过访问几个Coordinator节点获取整个集群的SQL运行情况，可减少运维压力。
#### 根据业务需求，配置impala资源池和资源队列，核心业务使用单独的队列隔离，并配置mem_limit和exec_time_limit_s避免大查询
使用资源队列可避免不同业务相互抢占资源，相互影响，具体请参考[Impala启用并配置动态资源池](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_24563.html)。
#### OBS存储开启本地缓存
OBS数据存储场景可根据业务需求配置本地缓存，提升读取速率。
配置单盘100 GB本地缓存示例：
```
--data_cache=/srv/BigData/data1/impala:100GB
```
#### HDFS存储开启短路读
HDFS存储场景下可开启短路读，提升读取速率，具体请参考：<https://impala.apache.org/docs/build/html/topics/impala_config_performance.html>
#### 新建表，新增分区等表结构变动操作后，执行Invalidate metadata \<table\>, 在数据入库/湖后，对于发生变化的表/分区进行主动refresh更新impala元数据
在非Impala引擎（Hive，Spark等）新建、修改表，需要在Impala侧执行Invalidate metadata \<table\>同步表schema信息，需要查询该表时才会同步全量元数据；而新增分区，插入数据等场景可主动执行refresh即可增量更新元数据。
#### 定时使用compute increment stats \<table_name\>刷新常用表的统计信息，加速查询
Impala依赖表统计信息对查询消耗的资源做预估，准确的统计信息有利于Impala更合理地解析执行计划，分配资源。
#### 定时进行小文件合并，减少单表的文件数量，提升元数据加载速率
Impala元数据和分区、文件数量正相关，太多分区会导致Impala元数据占用内存过大，刷新元数据时需要扫描的分区文件就越多，极大地降低查询效率。
#### 建表时存储类型建议选择orc或者parquet
orc和parquet是列式存储格式，读取效率更高，而且有更高的压缩率，可有效降低数据存储空间。
