题外总结
1、在impala中对表执行数据插入、增加表字段、增加分区操作,使用其他impala daemon再次查询是不需要执行刷新操作。
2、在hive中执行创建表操作,impala需要使用invalidate metadata 刷新,impala才可以查询出新建的表,refresh不能刷新impala中不存在的表。
3、在hive中执行数据插入、增加表字段、增加表分区,在impala中需使用刷新表(invalidate metadata 和 refresh 都可以 )才可以查询出最新表数据或者字段、分区。
Impala角色作用说明
Impala Daemon
Impala daemon是impala最核心组件,负责接收用户查询请求(ODBC协议),生成查询计划, 协调其他impala daemon执行查询计划,并汇总查询结果返回给用户。Impala daemon部署在每个datanode上,一般来说impalad只读取本机数据,尽量避免远程访问HDFS文件数据。
其中impala daemon被用于调度查询请求的时候,一般会把它称为调度者(Coordinator)
Impala Catalog Server
Impala Catalogd Server进程是Impala中用来传递Impala SQL导致的元数据变化的组件,它把这些变化传递给集群中所有的节点。一个集群中只需要一个节点上有这个守护进程。请求是通过Statestore传递的,因此Statestored和Catalogd 服务应当运行在同一节点上。
引入Catalogd进程的目的就是减少执行REFRESH和INVALIDATE METADATA语句,当在Impala中执行 CREATE TABLE 、 INSERT 或其他表修改、数据修改操作时,不再需要执行 REFRESH 或INVALIDATE METADATA 语句。但是在Hive中执行这些操作,或者直接在HDFS操作数据,这两个语句仍然需要,但是只需要在其中一个节点上(impala daemon)运行,不再需要在所有节点上都运行刷新命令。
Impala StateStore
Impala StateStore负责集群元数通知和分发。一个集群中只需要一个节点上有这个守护进程,如果Impala集群中某个节点因为各种原因离线,Impala StateStore会及时通知集群中其他节点,避免之后的查询会落到这些离线节点。
StateStore并不是必须的,它只是在Impala集群中有节点出错时才起作用,而如果StateStore未启动或者不能提供服务,并不影响Impala集群中其他节点正常工作,而Impala集群顶多是变得不可靠。当StateStore恢复在线,它将重建与其他节点的通讯,并恢复它的监控功能。
refresh和Invalidate metadata
refresh
语法命令
refresh [table] --刷新table表的元数据
refresh [table] partition [partition] --刷新table表partition分区的元数据
refresh执行过程
1、refresh table的时候,其中一个impala Daemon首先对catalogd发起resetMetadata请求。
2、catalogd收到该请求:对指定了partition的请求,执行reloadPartition操作,获取该分区最新的元数据并刷新;对未指定partition的请求,执行reloadTable操作,获取全部分区最新的元数据并刷新。这里的“刷新”是指Metastore中与缓存对比如果没有变化,就保持原状;如果有增删改,才会发生改变。
3、impala Daemon收到catalog返回的完整缓存,用它来更新本地缓存。
注:StateStored仍会负责广播新的元数据到其他节点。在广播完之前,除了已经执行刷新的impala Daemon之外的其他impala Daemon依旧保有旧的缓存。
Refresh特点
refresh的特点是同步性和增量性。并且它的执行是围绕单表以及单表的分区进行的,因此它更轻量级,也更适合分区元数据或数据文件更改之后的刷新。另外在hive里新建的表在impala里是无法使用refresh的。
Invalidate metadata
invalidate意思是“使无效,废除”,因此invalidate metadata的含义就是“废除(缓存的)元数据”,语法是
invalidate metadata --重新生成所有表元数据
invalidate metadata [table] --重新生成table表的元数据
invalidate metadata的执行过程
1、invalidate metadata的时候,impala daemon向catalogd发起无参的resetMetadata请求,表示清空所有元数据,待被使用时才异步加载。
2、invalidate metadata table的时候,其中一个impala Daemon获取到表table,对catalogd发起resetMetadata请求。
3、catalog收到该请求,执行invalidateTable操作,清除所有与table相关的元数据缓存,重新读取Metastore中的元数据,并生成新的缓存。但是此时生成的缓存只包含库名和表名,是不完整的。
4、catalog再生成一个标记缓存的版本号,将这个IncompleteTable 缓存和版本号一起返回给impala Daemon,然后继续异步加载其余的元数据。
5、impala Daemon收到catalogd返回的不完整缓存和版本号,用它来更新本地缓存。
注:
1、在刚执行完时,除了执行刷新操作的impala Daemon之外的其他impala Daemon仍然保有旧的元数据缓存,就算此节点保有的新元数据也是残缺的。只有当catalog异步加载完了table对应的所有元数据 ,才会生成一个更新的版本号,并将完整的元数据通过statestore广播给所有impala Daemon,整个Impala集群的元数据感知才会达到一致。
2、只有设置了启动参数 –load_table_in_background=true 才会异步加载元数据。CM默认会加这个参数,建议大集群中设为false。否则对于大集群可能启动时间非常长,甚至几个小时都启动不完。
Invalidate matadata的特点
invalidate metadata的特点就是异步性和全量性。但是它涉及到大批量元数据的更改,所以较为消耗资源和时间。
以上结论如有错误欢迎联系指正。
点个在看你最好看