[
https://issues.apache.org/jira/browse/HIVE-14819?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15517776#comment-15517776
]
Jason Dere commented on HIVE-14819:
-----------------------------------
I see another issue related to being able to determine if a function is a
permanent UDF:
When Hive attempts to register all of the existing permanent UDFs during Hive
initialization, it does not download the JARs and add them to the classloader.
However as you can see from the stack trace, it does try to get the UDF class
in order to add it to this persistent UDFs list. This fails since Hive has not
loaded the resources. As far as I can tell, this is going to fail for any
permanent UDFs which require JARs which are not in Hive's classpath at
initialization time.
While this does not prevent permanent functions from working in most cases
(dynamic lookup works and it's added to the session registry), this does cause
problems with being able to tell if this is a permanent function because the
UDF's class is never added to the system registry's list of persistent
functions. Thus FunctionRegistry.isPermanentFunction() does not work properly.
{noformat}
016-09-23T00:32:47,869 WARN [main]: metadata.Hive
(Hive.java:reloadFunctions(247)) - Failed to register persistent function
sleep2:org.apache.hive.udf.generic.GenericUDFSleep. Ignore and continue.
java.lang.RuntimeException: java.lang.ClassNotFoundException:
org.apache.hive.udf.generic.GenericUDFSleep
at
org.apache.hadoop.hive.ql.exec.Registry.getPermanentUdfClass(Registry.java:483)
~[hive-exec-2.1.0.jar:2.1.0]
at
org.apache.hadoop.hive.ql.exec.Registry.addFunction(Registry.java:466)
~[hive-exec-2.1.0.jar:2.1.0]
at
org.apache.hadoop.hive.ql.exec.Registry.registerPermanentFunction(Registry.java:239)
~[hive-exec-2.1.0.jar:2.1.0]
at
org.apache.hadoop.hive.ql.exec.FunctionRegistry.registerPermanentFunction(FunctionRegistry.java:1511)
~[hive-exec-2.1.0.jar:2.1.0]
at
org.apache.hadoop.hive.ql.metadata.Hive.reloadFunctions(Hive.java:243)
~[hive-exec-2.1.0.jar:2.1.0]
at
org.apache.hadoop.hive.ql.metadata.Hive.registerAllFunctionsOnce(Hive.java:224)
~[hive-exec-2.1.0.jar:2.1.0]
at org.apache.hadoop.hive.ql.metadata.Hive.<init>(Hive.java:369)
~[hive-exec-2.1.0.jar:2.1.0]
at org.apache.hadoop.hive.ql.metadata.Hive.create(Hive.java:313)
~[hive-exec-2.1.0.jar:2.1.0]
at org.apache.hadoop.hive.ql.metadata.Hive.getInternal(Hive.java:293)
~[hive-exec-2.1.0.jar:2.1.0]
at org.apache.hadoop.hive.ql.metadata.Hive.get(Hive.java:269)
~[hive-exec-2.1.0.jar:2.1.0]
at
org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:558)
~[hive-exec-2.1.0.jar:2.1.0]
at
org.apache.hadoop.hive.ql.session.SessionState.beginStart(SessionState.java:531)
~[hive-exec-2.1.0.jar:2.1.0]
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:705)
~[hive-cli-2.1.0.2.5.1.0-46.jar:2.1.0.2.5.1.0-46]
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:641)
~[hive-cli-2.1.0.2.5.1.0-46.jar:2.1.0.2.5.1.0-46]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
~[?:1.8.0_91]
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
~[?:1.8.0_91]
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[?:1.8.0_91]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
at org.apache.hadoop.util.RunJar.run(RunJar.java:233)
~[hadoop-common-2.7.3.2.5.1.0-46.jar:?]
at org.apache.hadoop.util.RunJar.main(RunJar.java:148)
~[hadoop-common-2.7.3.2.5.1.0-46.jar:?]
Caused by: java.lang.ClassNotFoundException:
org.apache.hive.udf.generic.GenericUDFSleep
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
~[?:1.8.0_91]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_91]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_91]
at java.lang.Class.forName0(Native Method) ~[?:1.8.0_91]
at java.lang.Class.forName(Class.java:348) ~[?:1.8.0_91]
at
org.apache.hadoop.hive.ql.exec.Registry.getPermanentUdfClass(Registry.java:481)
~[hive-exec-2.1.0.jar:2.1.0]
... 19 more
{noformat}
> FunctionInfo for permanent functions shows TEMPORARY FunctionType
> -----------------------------------------------------------------
>
> Key: HIVE-14819
> URL: https://issues.apache.org/jira/browse/HIVE-14819
> Project: Hive
> Issue Type: Bug
> Components: UDF
> Affects Versions: 2.1.0
> Reporter: Jason Dere
> Assignee: Jason Dere
> Attachments: HIVE-14819.1.patch
>
>
> The FunctionInfo has a FunctionType field which describes if the function is
> a builtin/persistent/temporary function. But for permanent functions, the
> FunctionInfo being returned by the FunctionRegistry is showing the type to be
> TEMPORARY.
> This affects things which may be depending on function type, for example
> LlapDecider, which will allow builtin/persistent UDFs to be used in LLAP but
> not temporary functions.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)