Hive学习笔记——metastore listener
除了使用hive hook来记录hive上用户的操作之外,还可以使用hive metastore listener来进行记录,参考:
1 | https: //towardsdatascience .com /apache-hive-hooks-and-metastore-listeners-a-tale-of-your-metadata-903b751ee99f |
hive metastore的接口有3种,分别是
Property | Abstract class |
hive.metastore.pre.event.listeners | org.apache.hadoop.hive.metastore.MetaStorePreEventListener |
hive.metastore.end.function.listeners | org.apache.hadoop.hive.metastore.MetaStoreEndFunctionListener |
hive.metastore.event.listeners | org.apache.hadoop.hive.metastore.MetaStoreEventListener |
下面的代码中继承了MetaStoreEventListener,实现的功能是在建表和修改表的时候,日志输出一下table的元数据信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | package com.bigdata.hive; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.metastore.MetaStoreEventListener; import org.apache.hadoop.hive.metastore.events.AlterTableEvent; import org.apache.hadoop.hive.metastore.events.CreateTableEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; public class MyListener extends MetaStoreEventListener { private static final Logger LOGGER = LoggerFactory.getLogger(MyListener.class); private static final ObjectMapper objMapper = new ObjectMapper(); public MyListener(Configuration config) { super(config); logWithHeader( " created " ); } @Override public void onCreateTable(CreateTableEvent event) { logWithHeader(event.getTable()); } @Override public void onAlterTable(AlterTableEvent event) { logWithHeader(event.getOldTable()); logWithHeader(event.getNewTable()); } private void logWithHeader(Object obj) { LOGGER.info( "[CustomListener][Thread: " + Thread.currentThread().getName() + "] | " + objToStr(obj)); } private String objToStr(Object obj) { try { return objMapper.writeValueAsString(obj); } catch (IOException e) { LOGGER.error( "Error on conversion" , e); } return null; } } |
进行打包
1 | mvn clean package |
将jar包放到/var/lib/hive目录下,并修改用户组
1 2 | lintong@master: /var/lib/hive $ ls -al| grep jar -rw-r--r-- 1 hive hive 363002613 12月 26 16:30 bigdata-1.0-SNAPSHOT-jar-with-dependencies.jar |
在CDH界面上配置metastore listener,注意是在metastore的配置项中,而不是hiveserver2的
然后重启hive
之后在HUE上运行建表语句
1 | create table test_table2( id int,name string) |
查看hive metastore的日志,可以看到日志中打印了所创建的hive表的元数据信息
1 2 3 | lintong@master: /var/log/hive $ tail -f hadoop-cmf-hive-HIVEMETASTORE-master.log.out | grep Listen 2021-12-26 21:43:53,737 INFO com.bigdata.hive.MyListener: [main]: [CustomListener][Thread: main] | " created " 2021-12-26 21:45:15,224 INFO com.bigdata.hive.MyListener: [pool-5-thread-14]: [CustomListener][Thread: pool-5-thread-14] | { "tableName" : "CM_TEST_TABLE" , "dbName" : "cloudera_manager_metastore_canary_test_db_hive_hivemetastore_0a5c4e82140edb166b3b3c29b6817024" , "owner" :null, "createTime" :1640526315, "lastAccessTime" :0, "retention" :0, "sd" :{ "cols" :[{ "name" : "s" , "type" : "string" , "comment" : "test string" , "setType" : true , "setComment" : true , "setName" : true },{ "name" : "f" , "type" : "float" , "comment" : "test float" , "setType" : true , "setComment" : true , "setName" : true },{ "name" : "a" , "type" : "array<map<string,struct<p1:int,p2:int>>>" , "comment" : "test complex type" , "setType" : true , "setComment" : true , "setName" : true }], "location" : "hdfs://master:8020/user/hue/.cloudera_manager_hive_metastore_canary/hive_HIVEMETASTORE_0a5c4e82140edb166b3b3c29b6817024/cm_test_table" , "inputFormat" :null, "outputFormat" :null, "compressed" : false , "numBuckets" :1, "serdeInfo" :{ "name" : "CM_TEST_TABLE" , "serializationLib" :null, "parameters" :{ "serialization.format" : "1" }, "setSerializationLib" : false , "setParameters" : true , "parametersSize" :1, "setName" : true }, "bucketCols" :[], "sortCols" :[], "parameters" :{}, "skewedInfo" :null, "storedAsSubDirectories" : false , "setParameters" : true , "setSkewedInfo" : false , "colsSize" :3, "colsIterator" :[{ "name" : "s" , "type" : "string" , "comment" : "test string" , "setType" : true , "setComment" : true , "setName" : true },{ "name" : "f" , "type" : "float" , "comment" : "test float" , "setType" : true , "setComment" : true , "setName" : true },{ "name" : "a" , "type" : "array<map<string,struct<p1:int,p2:int>>>" , "comment" : "test complex type" , "setType" : true , "setComment" : true , "setName" : true }], "setCols" : true , "setLocation" : true , "setInputFormat" : false , "setOutputFormat" : false , "setCompressed" : true , "setNumBuckets" : true , "setSerdeInfo" : true , "bucketColsSize" :0, "bucketColsIterator" :[], "setBucketCols" : true , "sortColsSize" :0, "sortColsIterator" :[], "setSortCols" : true , "setStoredAsSubDirectories" : false , "parametersSize" :0}, "partitionKeys" :[{ "name" : "p1" , "type" : "string" , "comment" : "partition-key-1" , "setType" : true , "setComment" : true , "setName" : true },{ "name" : "p2" , "type" : "int" , "comment" : "partition-key-2" , "setType" : true , "setComment" : true , "setName" : true }], "parameters" :{ "transient_lastDdlTime" : "1640526315" }, "viewOriginalText" :null, "viewExpandedText" :null, "tableType" :null, "privileges" :null, "temporary" : false , "ownerType" : "USER" , "partitionKeysSize" :2, "setParameters" : true , "setTableType" : false , "setTableName" : true , "setOwner" : false , "setRetention" : true , "partitionKeysIterator" :[{ "name" : "p1" , "type" : "string" , "comment" : "partition-key-1" , "setType" : true , "setComment" : true , "setName" : true },{ "name" : "p2" , "type" : "int" , "comment" : "partition-key-2" , "setType" : true , "setComment" : true , "setName" : true }], "setPartitionKeys" : true , "setViewOriginalText" : false , "setViewExpandedText" : false , "setPrivileges" : false , "setTemporary" : false , "setOwnerType" : true , "setDbName" : true , "setCreateTime" : true , "setLastAccessTime" : true , "setSd" : true , "parametersSize" :1} |
本文只发表于博客园和tonglin0325的博客,作者:tonglin0325,转载请注明原文链接:https://www.cnblogs.com/tonglin0325/p/14615980.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2016-12-26 机器学习——利用K-均值聚类算法对未标注数据分组
2016-12-26 Ubuntu16.04安装Ranger2.1.0