Return-Path: X-Original-To: apmail-hive-issues-archive@minotaur.apache.org Delivered-To: apmail-hive-issues-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 532EC18716 for ; Tue, 1 Dec 2015 09:55:11 +0000 (UTC) Received: (qmail 95806 invoked by uid 500); 1 Dec 2015 09:55:11 -0000 Delivered-To: apmail-hive-issues-archive@hive.apache.org Received: (qmail 95782 invoked by uid 500); 1 Dec 2015 09:55:11 -0000 Mailing-List: contact issues-help@hive.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hive.apache.org Delivered-To: mailing list issues@hive.apache.org Received: (qmail 95755 invoked by uid 99); 1 Dec 2015 09:55:11 -0000 Received: from arcas.apache.org (HELO arcas) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Dec 2015 09:55:11 +0000 Received: from arcas.apache.org (localhost [127.0.0.1]) by arcas (Postfix) with ESMTP id EE9192C14F0 for ; Tue, 1 Dec 2015 09:55:10 +0000 (UTC) Date: Tue, 1 Dec 2015 09:55:10 +0000 (UTC) From: "Ratandeep Ratti (JIRA)" To: issues@hive.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Commented] (HIVE-11878) ClassNotFoundException can possibly occur if multiple jars are registered one at a time in Hive MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/HIVE-11878?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15033441#comment-15033441 ] Ratandeep Ratti commented on HIVE-11878: ---------------------------------------- [~jdere] I'm unable to reproduce {{org.apache.hadoop.hive.cli.TestCliDriver.testCliDriver_udf_classloader_dynamic_dependency_resolution}} I'll check why {{org.apache.hadoop.hive.ql.security.authorization.plugin.TestHiveAuthorizerShowFilters.org.apache.hadoop.hive.ql.security.authorization.plugin.TestHiveAuthorizerShowFilters}} is failing. > ClassNotFoundException can possibly occur if multiple jars are registered one at a time in Hive > ------------------------------------------------------------------------------------------------ > > Key: HIVE-11878 > URL: https://issues.apache.org/jira/browse/HIVE-11878 > Project: Hive > Issue Type: Bug > Components: Hive > Affects Versions: 1.2.1 > Reporter: Ratandeep Ratti > Assignee: Ratandeep Ratti > Labels: URLClassLoader > Attachments: HIVE-11878 ClassLoader Issues when Registering Jars.pptx, HIVE-11878.2.patch, HIVE-11878.3.patch, HIVE-11878.patch, HIVE-11878_approach3.patch, HIVE-11878_approach3_per_session_clasloader.patch, HIVE-11878_approach3_with_review_comments.patch, HIVE-11878_approach3_with_review_comments1.patch, HIVE-11878_qtest.patch > > > When we register a jar on the Hive console. Hive creates a fresh URL classloader which includes the path of the current jar to be registered and all the jar paths of the parent classloader. The parent classlaoder is the current ThreadContextClassLoader. Once the URLClassloader is created Hive sets that as the current ThreadContextClassloader. > So if we register multiple jars in Hive, there will be multiple URLClassLoaders created, each classloader including the jars from its parent and the one extra jar to be registered. The last URLClassLoader created will end up as the current ThreadContextClassLoader. (See details: org.apache.hadoop.hive.ql.exec.Utilities#addToClassPath) > Now here's an example in which the above strategy can lead to a CNF exception. > We register 2 jars *j1* and *j2* in Hive console. *j1* contains the UDF class *c1* and internally relies on class *c2* in jar *j2*. We register *j1* first, the URLClassLoader *u1* is created and also set as the ThreadContextClassLoader. We register *j2* next, the new URLClassLoader created will be *u2* with *u1* as parent and *u2* becomes the new ThreadContextClassLoader. Note *u2* includes paths to both jars *j1* and *j2* whereas *u1* only has paths to *j1* (For details see: org.apache.hadoop.hive.ql.exec.Utilities#addToClassPath). > Now when we register class *c1* under a temporary function in Hive, we load the class using {code} class.forName("c1", true, Thread.currentThread().getContextClassLoader()) {code} . The currentThreadContext class-loader is *u2*, and it has the path to the class *c1*, but note that Class-loaders work by delegating to parent class-loader first. In this case class *c1* will be found and *defined* by class-loader *u1*. > Now *c1* from jar *j1* has *u1* as its class-loader. If a method (say initialize) is called in *c1*, which references the class *c2*, *c2* will not be found since the class-loader used to search for *c2* will be *u1* (Since the caller's class-loader is used to load a class) > I've added a qtest to explain the problem. Please see the attached patch -- This message was sent by Atlassian JIRA (v6.3.4#6332)