天天看点

impala元数据放到mysql_Impala JOIN操作及元数据过期问题

Impala JOIN操作及元数据过期问题

极豆技术博客 » 极豆技术博客 2013-11-13 609 阅读

Hints(Joins 问题)

Hints 英译为“暗示,示意,提示”,用于数据表join时影响执行语句被后台程序解析成执行计划的,达到优化执行效率的目的。说白了这有点像写Java代码里面的注解(anotation)。

主要有两个hints:Hints解释使用场景

[SHUFFLE]把join操作使用分区技术(”partitioned” technique 之所以叫分区技术,因为这种join很类似分区的表(注:原文刚好的反意思,我猜是编辑写错了)),取出匹配的数据,把子数据集分发到其他的节点运算。用于不可预测数据量的两个大表join

[BROADCAST]join操作使用“广播”技术(”broadcast” technique),把jion的右边的小表内容全部发送到各个节点。当有一个大表和一个小表。小表放右边,这一点和hive刚好相反

三种使用案例:

1、用一个查找表的数据(如100行数据)去匹配一个包含很多数据的用户记录表。Join右边的表被发送到所有计算节点。selectcustomer.address,state_lookup.state_namefrom customer join[broadcast]state_lookup

on(customer.state_id=state_lookup.state_id);

2、Join两个大的数据表,我们使用[shuffle]来暗示程序使用“分区”方式执行selectweather.wind_velocity,geospatial.altitudefrom weather join[shuffle]geospatial

on(weather.lat=geospatial.latandweather.long=geospatial.long);

3、当有三个表,其中两个大表(t1,t2),一个小表(t3)的时候该怎么做呢?这时候我们对两大表使用[shuffle],之后的结果集对第三个小表使用[broadcast]。selectt1.name,t2.id,t3.pricefrom t1 join[shuffle]t2 join[broadcast]t3

on(t1.id=t2.idandt2.id=t3.id);

元数据更新

impala获取元数据信息是会过期的,若使用过期的元数据进行查询的话得到的结果就不准确了。那么什么情况下会发现元数据过期呢?如何避免呢?下面我们详细看看。

元数据需要更新的情况,即过期的情况:

1、装载文件或者ETL时插入数据

2、来自与集群里其他的impalad实例或hive改变元数据

3、来自客户端的impala shell或者ODBC直接连接的修改元数据

不需要更新元数据的情况:来自与同一个impala节点的ALTER TABLE,INSERT,或者其他修改表的语句。

修改元数据的操作大概有:

1、Hive : ALTER ,CREATE,DROP,INSERT

2、Impalad:CREATE TABLE,ALTER TABLE,INSERT操作

解决方法:

1、INVALIDATE METADATA  [table_name]

2、REFRESH table_name

INVALIDATE METADATA:让元数据过期腐败不可用,当表重新引用的时候重新加载。缺点:该语句是重量级的,比较耗时。该特性来自与Impala的1.1版本

REFRESH:刷新表的元数据,必须跟上表名这个参数(确定)。实时的,轻量级的(优点)

因此当需要更新大量元数据时使用INVALIDATE METADATA(不加表名) 。否则优先使用REFRESH。

也可以当启动impala-shell的时候使用-r(–refresh_after_connect)参数,等连接到impala server时更新元数据。