数据分析引擎之Impala-2
3 Impala 高级内容
Impala之refresh命令
1 | refresh的主要功能是负责重新加载指定表的最新元数据信息,以及增量加载表中新的数据文件的位置信息。 |
1 | 但是针对一些特殊情况,会导致Impala无法自动感知到最新的元数据变化: |
第一种情况
1 | 首先查询一下之前创建的外部表im_external_table中的数据: |
1 | 我们尝试连到cdh03这个节点上执行查询,看看结果是什么样的: |
1 | 那我们到Hive中查询一下看看: |
1 | 想要让Impala识别到这个表中数据文件的变化情况,就需要使用refresh刷新这个表的元数据了。 |
1 | 此时在cdh02节点中查询这个表中的数据,发现可以获取到最新的6条数据了。 |
第二种情况
1 | 接下来我们演示一下第二种情况: |
1 | 我们先到Hive中查询验证一下: |
第三种情况
1 | 当你使用HDFS命令从表的数据目录中删除一个文件,在没有使用refresh 刷新表的时候,还是可以从表中查询到对应的数据: |
1 | 本来这个表中有3个数据文件,现在删除1个数据文件之后,还剩下2个。 |
1 | 此时发现只剩下6条数据了,这是正确的。 |
1 | 此时发现还是可以查到已经删除的数据文件中的数据,这是因为那些数据被缓存到了内存中,此时需要重新使用refresh刷新元数据才能获取到最新的: |
invalidate metadata命令
1 | 我们前面讲的refresh,是负责重新加载指定表的最新元数据信息,以及增量加载表中新的数据文件的位置信息,这个操作可以认为是增量更新,所以说他是轻量级的,性能开销较小。 |
1 | Impala在对一个元数据标记为过期的表进行查询的时候,会自动重新加载这个表最新的元数据。 |
1 | invalidate metadata命令的语法格式的这样的: |
1 | 下面我们来演示一个invalidate metadata的典型使用场景 |
1 | 在Hive中可以查到这个表,也可以正常操作这个表(此时表中没有数据): |
1 | 此时使用refresh就不好使了,因为impala中现在没有识别到这个表,使用refresh也会提示表不存在。 |
1 | 这样就可以正常使用了。 |
Impala的数据存储和数据压缩
1 | 前面我们在学习Hive的时候,详细分析了数据存储格式和数据压缩格式,那么这些数据存储格式和数据压缩格式在Impala中也是支持的。 |

1 | -存储格式:常见的数据存储格式,Hive中都支持,Impala也是可以都读取的。 |
1 | 这是数据存储相关的内容。 |
1 | 下面演示一下Impala中RCFile格式的使用。 |
1 | 此时发现insert语句执行报错,错误日志提示说不能向RCFILE格式的表中写入数据,目前Impala中只能支持向Text和PARQUET格式的表中写入数据。 |
1 | 上面的SQL执行成功之后就可以在Hive中或者Impala中查询表im_t1_rcfile中的数据了。 |
1 | 所以为了避免在Impala中操作表遇到问题,建议在Hive中统一创建、管理表,只在Impala中提供快速查询服务,并且最好在每次查询之前先刷新一下表,这样可以保证每次查询的都是最新的数据。 |
Impala SQL VS Hive SQL
Impala SQL中不支持的特性
1 | 下面总结一些在Hive SQL中支持,但是在Impala SQL中不支持的特性,大家以后在使用Impala的时候需要留意: |
SQL中不支持多个distinct
1 | 举个例子: |
1 | 在impala中,select语句中使用多个distinct语句是会报错的: |
1 | 在Hive中是可以支持这种语法的: |
不支持常见的复合数据类型
1 | -不支持常见的复合数据类型。 |
1 | 例如在Hive中支持的array、map、struct这些复合数据类型,Impala中都不支持。 |
1 | [cdh02:21000] default> create table stu2( |
1 | [cdh02:21000] default> create table stu3( |
1 | 那我们在Hive中创建的复合数据类型,在Impala中是否支持查询呢? |
1 | 准备测试数据: |
1 | 到Impala中查询: |
不支持collect_list()/set()函数
1 | Impala中不支持collect_list()和collect_set()函数。 |
1 | 错误提示collect_list()和collect_set()是未知函数。 |
不支持split()、explode()函数
1 | Impala中不支持split()、explode()函数。 |
1 | 准备测试数据: |
1 | 错误提示split()、explode()、lateral view都不支持。 |
Impala和Hive的典型应用场景
1 | 针对Impala和Hive的典型应用场景 |
1 | 针对Impala和Hive on Spark如何选择呢? |
Impala集成HBase
1 | 为了解决HBase无法使用SQL实现数据分析的问题,可以通过Hive来实现,也可以通过Impala来实现。 |
CDH平台中安装HBase
1 | 目前CDH平台中还没有安装HBase集群,在使用之前,需要先安装HBase(一主两从)。 |

1 | 选中 HBase |

1 | 点击右下角的继续按钮 |

1 | 自定义角色分配,根据集群中节点的负载情况给HBase REST Server和HBase Thrift Server选择合适的节点即可。 |

1 | 默认不需要修改,直接点击继续按钮即可 |

1 | 等待状态变为 已完成 ,点击继续按钮 |


1 | 重启Zookeeper,点击重启按钮 |

1 | 点击重启过时服务按钮 |

1 | 等待状态变为已完成,然后点击完成按钮即可。 |

让Impala支持HBase
1 | 在Impala中修改配置,以支持HBase,否则Impala连不上HBase。 |

1 | 重启Impala |

1 | 点击重启过时服务按钮 |


1 | 等待状态变为 已完成,点击完成按钮即可 |

HBase->Hive->Impala
(1)在HBase中创建表
1 | 下面开始实际操作一下这个流程。 |
1 | 注意:为了避免rowkey出现热点,所以在向HBase中添加数据的时候,针对rowkey中的id字段的值进行了反转。 |
(3)在Hive中创建外部表
1 | create external table video_user( |
1 | 解释: |
1 | 注意: |
(4)将表同步到Impala中
1 | [root@cdh01 ~]# impala-shell -i cdh02:21000 |
1 | 此时就可以在Impala中操作video_user这个表了,其实对应的就是操作hbase中的video_user表。 |
1 | [cdh02:21000] default> select * from video_user; |
1 | 此时这个SQL语句相当于我们使用Scan对HBase中的表进行全表扫描了 |
1 | 这样表示会根据hbase表中的rowkey进行查询 |
1 | 这样表示会根据hbase表中的某个普通字段进行查询 |
1 | 此时这个SQL语句相当于我们在使用HBase中的Scan扫描数据时传入了SingleColumnFilter过滤器,对普通列进行过滤查询,此时没有使用到rowkey,所以依然是全表扫描,效率一般。 |
1 | 分组聚合查询: |