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