前言
在解析数据原始层的时候,数据结构比较复杂。嵌套结构多,所以使用了UDF+UDTF来解析
0.13 版本hive udf udtf大概流程是上传jar包、添加jar、注册函数。
后来发现0.13版本后提供了永久注册函数;
在开发好代码后,按照以前的习惯,jar包、添加jar、注册函数。后来发现可以永久注册函数。就在卸载旧版操作jar 到使用永久注册函数时出现了问题。
首先来介绍下临时注册和永久注册的流程
注册函数步骤
临时注册
1.导入jar包
2.移动到hive的lib下
3.添加jar到hive
hive (gmall)> add jar ods-analysis-1.0-SNAPSHOT.jar-1.0-SNAPSHOT.jar ;
4.注册临时函数
$hive>create temporary function base_analizer AS 'com.glory.udf.BaseFieldUDF';
永久注册函数
- 导入jar包
[root@node10 jars]# pwd
/opt/jars
[root@node10 jars]# ll
total 1224
-rw-r--r-- 1 root root 5080 Sep 14 18:59 ods-analysis-1.0-SNAPSHOT.jar-1.0-SNAPSHOT.jar
- 上传到hdfs
[root@node10 jars]# hadoop dfs -put /opt/jars/ods-analysis-1.0-SNAPSHOT.jar-1.0-SNAPSHOT.jar /user/hive/jars
假如没有/user/hive/jars目录,先创建
- hive 注册
hive (gmall)> create function base_analizer as 'com.glory.udf.BaseFieldUDF' using jar 'hdfs://node09:8020/user/hive/jars/ods-analysis-1.0-SNAPSHOT.jar-1.0-SNAPSHOT.jar';
hive (gmall)> create function flat_analizer as 'com.glory.udtf.EventJsonUDTF' using jar 'hdfs://node09:8020/user/hive/jars/ods-analysis-1.0-SNAPSHOT.jar-1.0-SNAPSHOT.jar';
问题描述
把打好的jar包放到了hive lib下,并且add jar ods-analysis-1.0-SNAPSHOT.jar-1.0-SNAPSHOT.jar 到hive中。
再想通过hdfs 上传jar包注册函数,会报以下错误。
报错信息
Caused by: AlreadyExistsException(message:Function base_analizer already exists)
at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$create_function_result$create_function_resultStandardScheme.read(ThriftHiveMetastore.java)
at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$create_function_result$create_function_resultStandardScheme.read(ThriftHiveMetastore.java)
at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$create_function_result.read(ThriftHiveMetastore.java)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:86)
at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.recv_create_function(ThriftHiveMetastore.java:4214)
at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.create_function(ThriftHiveMetastore.java:4201)
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.createFunction(HiveMetaStoreClient.java:2814)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.invoke(RetryingMetaStoreClient.java:212)
at com.sun.proxy.$Proxy34.createFunction(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient$SynchronizedHandler.invoke(HiveMetaStoreClient.java:2773)
at com.sun.proxy.$Proxy34.createFunction(Unknown Source)
at org.apache.hadoop.hive.ql.metadata.Hive.createFunction(Hive.java:4569)
... 23 more
报错分析
base_analizer 已经注册过,并且还在lib和 jars list 中存在。
- 在hive中delete jar
hive (gmall)> delete jar;
- 删除 lib 中删除jar包
[root@node09 lib]# rm -f ods-analysis-1.0-SNAPSHOT.jar-1.0-SNAPSHOT.jar
3.重新根据永久注册函数流程注册
永久注册函数flat_analizer时,请注意,在drop function之前,不要修改hdfs jar。
比如:在注册了函数时,程序路径是com.glory.anaylzer.udtf.EventJsonUDTF,后来代码修改,并且路径修改为com.glory.anaylzer.EventJsonUDTF。在drop function flat_analizer时报错。
2020-09-14 18:05:31,015 ERROR [3c330f9c-9f8b-4532-b3e8-7e50b6cb1026 main] exec.FunctionRegistry (Registry.java:registerToSessionRegistry(683)) - Unable to load UDF class: java.lang.ClassNotFoundException: com.glory.anaylzer.udtf.EventJsonUDTF
因此,在drop掉函数之前时,请不要把结构不一样的jar包放在hdfs的路径上。
参考hive官网https://cwiki.apache.org/confluence/display/Hive/HivePlugins
网友评论