Impala与Hive混合使用的一个深坑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Impala与Hive混合使用的一个深坑相关的知识,希望对你有一定的参考价值。

参考技术A 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中删除这个表将会导致原始数据被删除。

         

以上是关于Impala与Hive混合使用的一个深坑的主要内容,如果未能解决你的问题,请参考以下文章

Spark Kudu 结合

如何使用单个字段的混合结构/字符串值解析 Hive 中的 JSON?

大数据专题--Hive 与 impala

impala的 now 用hive怎么实现

细说Impala和Hive的关系

Hive 和 Impala 以及它们与 HDFS 的交互