
# Impala应用开发规则
#### 创建集群时只需指定一个Catalog和一个StateStore
如果已经创建了两个Catalog和StateStore，Impalad角色需要指定--catalog_service_host和--state_store_host，Catalog角色需要指定--state_store_host。
#### Impalad（Coordinator）角色的jvm内存要大于或等于Catalog角色的jvm内存
Impala的元数据存放在内存中，Impalad需要从Catalog同步全量元数据，要保证Impala的jvm内存大于Catalog的jvm内存，才可以容纳下这些元数据。
![](https://support.huaweicloud.com/devg-rule-mrs/zh-cn_image_0000002006890168.png)
#### 建表时分区不要超过10万个，分区太多会影响元数据加载速度，阻塞查询
Impala元数据和分区、文件数量正相关，太多分区会导致Impala元数据占用内存过大，刷新元数据时需要扫描的分区文件就越多，极大地降低查询效率。
#### 建表时整数类型的分区键不补前置0，例如'hour=01'等分区
整数类型分区使用补齐前缀0的方式，会导致Impala解析分区不准确，影响元数据刷新。
#### 列名、别名无特殊情况使用英文，不使用中文
除注释外，由于中文编码存在特殊字符，使用中文会导致impala解析时遇到不能识别的符号，从而出现解析失败或进入死循环。
#### 包含case when子句的view视图或子查询，不应嵌套超过3层，避免出现嵌套过深导致Impala内存溢出
case when子句包含多个判断分支，在多层view视图或子查询嵌套场景下，复杂度呈指数增长，通过实测该场景下嵌套层数不能超过3层，否则会出现内存溢出。可使用临时表替代view或子查询，将一个多重嵌套拆分成多个查询执行。
#### 分区表select \* 必须带上分区键
分区表查询select \* 不带分区键，会触发Impala全表扫描，极大地占用计算资源，非必要场景下请按分区查询。
