[ 
https://issues.apache.org/jira/browse/YARN-4577?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15240658#comment-15240658
 ] 

Vinod Kumar Vavilapalli commented on YARN-4577:
-----------------------------------------------

Just caught up with the wall of comments.

+1 in general for the ApplicationClassloader based solution. Aux-services was 
always a hack since Chris Douglas and I originally introduced it, the better 
solution is to move these services as first-class apps on top of YARN, but we 
are where we are.

[~sjlee0],
bq. For example, if the aux service code depends on another class property 
(owned by the aux service) in the configuration, that will be invoked via 
Configuration.getClass(), and it will still use the system classloader to load 
that class. Then it's very likely that you'll get a ClassNotFoundException.
Sangjin, you may be missing one important thing here - unlike in the MapReduce 
case, there is no shared Configuration object between NodeManager and the 
specific aux-service implementation here. We simply do not pass in any 
configuration anywhere as part of the AuxService APIs - so this entire thread 
of reasoning about getClass() is no long a problem? If needed, we can document 
advising against adding Conf as part of future API changes.

bq. The thread context classloader represents another similar problem. The 
moment the aux service code hits a code path that does Class.forName() that 
loads classes via the thread context classloader, and it needs to load an aux 
service-related class (that is not present in the main NM classpath), you will 
get a ClassNotFoundException.
In addition to wrapping aux-service API calls under a class-loader, wouldn't it 
suffice to simply have NM make all aux-services API calls in a separate thread 
whose ContextClassLoader is changed to be another custom one that resolves both 
System classes as well as AuxServices classes?

> Enable aux services to have their own custom classpath/jar file
> ---------------------------------------------------------------
>
>                 Key: YARN-4577
>                 URL: https://issues.apache.org/jira/browse/YARN-4577
>             Project: Hadoop YARN
>          Issue Type: Improvement
>    Affects Versions: 2.8.0
>            Reporter: Xuan Gong
>            Assignee: Xuan Gong
>         Attachments: YARN-4577.1.patch, YARN-4577.2.patch, 
> YARN-4577.20160119.1.patch, YARN-4577.20160204.patch, YARN-4577.3.patch, 
> YARN-4577.3.rebase.patch, YARN-4577.4.patch
>
>
> Right now, users have to add their jars to the NM classpath directly, thus 
> put them on the system classloader. But if multiple versions of the plugin 
> are present on the classpath, there is no control over which version actually 
> gets loaded. Or if there are any conflicts between the dependencies 
> introduced by the auxiliary service and the NM itself, they can break the NM, 
> the auxiliary service, or both.
> The solution could be: to instantiate aux services using a classloader that 
> is different from the system classloader.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to