1. 程式人生 > >如何監聽對 HIVE 元資料的操作

如何監聽對 HIVE 元資料的操作

目錄

簡介

公司有個元資料管理平臺,會定期同步 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

  1. 獲取 HIVE 程序 ID

    ps -ef |grep hive
  2. 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>

參考文件