美文网首页
hive 自定义函数UDF UDTF遇到的坑

hive 自定义函数UDF UDTF遇到的坑

作者: Rex_2013 | 来源:发表于2020-09-14 19:48 被阅读0次

    前言

    在解析数据原始层的时候,数据结构比较复杂。嵌套结构多,所以使用了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';
    

    永久注册函数

    1. 导入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
    
    1. 上传到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目录,先创建

    1. 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 中存在。

    1. 在hive中delete jar
    hive (gmall)> delete jar;
    
    1. 删除 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

    相关文章

      网友评论

          本文标题:hive 自定义函数UDF UDTF遇到的坑

          本文链接:https://www.haomeiwen.com/subject/battyktx.html