前言:

在日常的impala操作及运维中,遇到了一些问题,在此记录,防止后来人踩坑。

问题一:impala的substr

由于hive跑日常批量时间较长,因此考虑使用impala进行替换,在改写脚本中遇到了如下问题:

用hive 写 select substr("adbc",0,2) 获得数据为"ab",使用impala 写  select substr("adbc",0,2) 获得数据为空,正确写法应改为  select substr("adbc",1,2),获得数据为"ab"。

问题二:pyhive 连接impala

使用pyhton的pyhive包连接impala并执行sql语句,发现总是sql执行总是异常,对于几个SQL语句复合形成的存储过程总会有中间表没数据,相同的SQL用pyhive包连接hive并执行数据都正常。

查看底层源码,pyhive执行sql的函数execute(),对于impala来说,并没有控制其串行跑impala sql,导致实际执行的impala sql为并行的,即存储过程中的sql的先后顺序错乱,导致出现sql结果出现异常。

可通过poll()函数,获取sql执行状态,程序控制存储过程SQL串行执行,直至当前sql执行完成之后,再继续执行下个SQL,对于poll()函数返回的状态,主要有如下几种状态:

INITIALIZED_STATE = 0

RUNNING_STATE = 1

FINISHED_STATE = 2

CANCELED_STATE = 3

CLOSED_STATE = 4

ERROR_STATE = 5

UKNOWN_STATE = 6

PENDING_STATE = 7

TIMEDOUT_STATE = 8

其中部分状态也可以用于及时发现SQL报错。

问题三:impala增加新分区

之前都是用HIVE写入新分区,可直接写

insert overwrite  your_table_name  partition(partition_name= 'XX')

在使用impala往表的新分区写数据时报错

NoSuchMethodError: org.apache.hadoop.hive.metastore.MetaStoreUtils.updatePartitionStatsFast(Lorg/apache/hadoop/hive/metastore/api/Partition;Lorg/apache/hadoop/hive/metastore/Warehouse;)Z

出现此问题的原因主要还是impala与hive版本问题。应该是impala解析SQL的时候用到的是上面这个函数,而HIVE本身解析的时候用的不是该函数且该版本hive没有该函数,导致impala找不到执行函数,发生报错。

impala不能这样操作,需要先新建分区,再插入数据

Alter your_table_name add partition (partition_name= 'XX');

Insert overwrite  your_table_name partition(partition_name= 'XX');

问题四:impala读取不到hive的UNION的结果数据

当hive写入数据的SQL里使用了UNION之后,用impala去查询发现没有数据,但hive查询有数据。原因是HDFS目录结构多了一层,本来是分区底下直接是数据,使用了UNION后,有几个UNION,分区底下会出现几个文件夹,依次为1,2,3…,文件夹里面才是数据。导致Impala无法访问到具体数据。出现此问题的impala版本是2.6。

需要避免此问题最好的办法是最终写入数据时使用UNION,可以先写入临时表,再写入最终表。或者直接使用Impala写入数据。

问题五:impala实时刷新元数据的方案

经常出现hive创建了新分区,更改了表结构,创建表,删除表时,impala查询不到相应的数据,需要手动进行 refresh table或者invalidate metadata。最好的办法是读取HiveServer2的日志(具体操作不做展开),实时监测hive是否有创建分区,更改表结构,或者创建表,删除表,如果出现了上述操作,实时刷新impala相关元数据库。

典型报错如下:Caused by: java.sql.SQLException:
Failed to open HDFS file hdfs://hive/warehouse/ods.db/xxxtable/ppi=20190528/000006_0
Error(2): No such file or directory

参考文献: