Hive版本 1.1.0-cdh5.9.0 Impala版本 2.7.0-cdh5.9.0
Impala的高性能很好的弥补了Hive的查询响应慢的缺陷,在生产中若有实时查询的需求,我通常将这些表以Parquet格式将这些表的数据在Impala中另存一份,用于交互式分析。Impala能很好的兼容Hive的元数据,但反过来效果并不理想,今天就吃了大亏,记录下来与大家分享。
事情是这样的,有一张画像表(portrait)存在HBase中,在HIVE中基于这个HBase画像表创建了一个外部表(portrait_hbase)以支持SQL查询。为了提高查询性能,我们将这张外部表转存成Parquet格式。这里我使用Impala的 CREATE TABLE LIKE语法,语句如下:
然后再将portrait_hbase中的数据拷贝到portrait_parquet中,得到一张parquet画像表以获得较好的查询性能。目前为止一切看起很美好。现在我们将这个过程封装成一个脚本,每天定时执行。为了降低内存消耗,我们将这个脚本用HIVE执行,大致过程如下:
第一次测试执行通过,检查结果也没有问题,再次执行的时候却提示HBase画像表找不到,在HDFS中检查了下,数据确实没有了。第一反应是不是谁误删,各种翻看日志,发现确实有一条这个画像表被删除的日志,时间和用户名跟我之前的操作是吻合的,看来这个锅甩不掉,只能自己背了。
仔细分析一下,可能导致portrait表被删除的操作也只可能是删除portrait_parquet这步了,于是尝试着复现一下,在Impala下删除portrait_parquet并没有导致上面的问题,再在Hive中操作一次,问题复现了。原来在Impala中CREATE TABLE XX LIKE XXXX STORED AS PARQUET 跟直接 CREATE TABLE XXX STORED AS PARQUET 是不同的,前者会保留模板表的部分信息,并且如果模板表是一个外部表创建的新表的建表语句中是不会有 EXTERNAL 关键字的,如果在Hive中删除这个表将会导致原始数据被删除。