公司有个元数据管理平台,会定期同步 HIVE 中的元数据。但这样做有个问题,就是如果在 HIVE 中插入了一张新表或者新库等 HIVE 元数据变更的操作,元数据管理平台不能及时与 HIVE 表中的数据进行同步。因此需要调研下 HIVE 中有没有类似的监听机制,可以实现 HIVE 中有元数据更改时,能及时发通知给 元数据平台。整体的需求图如下所示

由于公司使用的 Hive 版本是 1.2.1,本文也会以此版本进行说明。如果您使用的是其他 HIVE 版本,无法就文章中的问题进行对应,请自行查阅 HIVE 官方文档 。先来看下 HIVE 的基本操作。

HIVE 基本操作

获取 HIVE 源码

$ git clone https://github.com/apache/hive.git

切换到 hive-1.2 分支

git checkout -b branch-1.2 origin/branch-1.2

切换到 hive 1.2.1 tag

git checkout release-1.2.1

编译 HIVE 源码

hive 1.2.1 版本既支持 hadoop 1 ,也支持 hadoop2 ,可通过 mvn 编译时属性指定。编译 hadoop 2 版本时,命令如下

mvn clean install -DskipTests -Phadoop-2
cd itests
mvn clean install -DskipTests -Phadoop-2

如果在 itests 中编译失败,可忽略错误,不影响对正常代码的编译

启动 HIVE

nohup hive --service metastore  2>&1 & 
nohup  hive --service hiveserver2   2>&1 & 

停止 HIVE

获取 HIVE 进程 ID

ps -ef |grep hive

kill 掉对应进程

监听对 HIVE 元数据的操作

经过调研, HIVE 中存在一个事件监听抽象类 MetaStoreEventListener ,具体 package 为 org.apache.hadoop.hive.metastore , 在 HIVE 源码的 metastore 模块下,包含常用的 create table, drop table, create database, drop database 等操作。

public abstract class MetaStoreEventListener implements Configurable {
  public void onCreateTable (CreateTableEvent tableEvent) throws MetaException {
  public void onDropTable (DropTableEvent tableEvent)  throws MetaException {
  public void onAlterTable (AlterTableEvent tableEvent) throws MetaException {
  public void onAlterPartition (AlterPartitionEvent partitionEvent)  throws MetaException {
  public void onCreateDatabase (CreateDatabaseEvent dbEvent) throws MetaException {
  public void onDropDatabase (DropDatabaseEvent dbEvent) throws MetaException {

而且这个抽象类在 hive-site.xml 中关联的配置是

    <property>
        <name>hive.metastore.event.listeners</name>
        <value/>
        <description/>
    </property>

只要实现了这个抽象类,将编译的 jar 包放在 ${HIVE_HOME}/lib 目录下,并配置好 hive-site.xml 文件的 hive.metastore.event.listeners 选项,重启即可生效。

开发这个插件时使用的 maven 依赖为

		<dependency>
			<artifactId>hive-exec</artifactId>
			<groupId>org.apache.hive</groupId>
			<version>1.2.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-common</artifactId>
			<version>2.6.5</version>
		</dependency>
  • HiveDeveloperFAQ
  • 作者:ReyCG

    出处:ReyCG 的博客 — https://www.cnblogs.com/reycg-blog/

    本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。

    如果本文对您有所帮助,还请帮忙 【推荐】 下此文。您的支持是对博主最大的鼓励,感谢您的认真阅读。