I'm running into an issue that I initially worked around by using an apache based HttpClient instead of anything backed by a jersey rest client. At this point, due to performance requirements, I feel that I need to utilize the client described below.
Trying to use the Apache AtlasClientV2 REST client within a Presto plugin consistently gives me this error due to the fact that I have to include the following dependencies in my pom.xml:
'''
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.17</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.17</version>
</dependency>
'''
When I do not include the above dependencies, there is no implementation method for a few of the methods required by AtlasClientV2. I get the following errors in that case:
'''
java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
at javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:120)
at org.apache.atlas.AtlasBaseClient.getAddressIfActive(AtlasBaseClient.java:516)
at org.apache.atlas.AtlasBaseClient.selectActiveServerAddress(AtlasBaseClient.java:500)
at org.apache.atlas.AtlasBaseClient.determineActiveServiceURL(AtlasBaseClient.java:291)
at org.apache.atlas.AtlasBaseClient.initializeState(AtlasBaseClient.java:420)
at org.apache.atlas.AtlasBaseClient.<init>(AtlasBaseClient.java:148)
at org.apache.atlas.AtlasClientV2.<init>(AtlasClientV2.java:106)
at com.eventbrite.integral.atlas.ApacheAtlasClient.setupAtlasClient(ApacheAtlasClient.java:43)
at com.eventbrite.integral.atlas.ApacheAtlasClient.getInstance(ApacheAtlasClient.java:23)
at com.eventbrite.integral.presto.handlers.HandleSelect.<clinit>(HandleSelect.java:33)
at com.eventbrite.integral.presto.PrestoQueryHandler.createDispatcher(PrestoQueryHandler.java:80)
at com.eventbrite.integral.presto.PrestoQueryHandler.<init>(PrestoQueryHandler.java:49)
at com.eventbrite.integral.presto.PrestoEventListener.<init>(PrestoEventListener.java:42)
at com.eventbrite.integral.presto.PrestoEventListenerFactory.create(PrestoEventListenerFactory.java:19)
at com.facebook.presto.eventlistener.EventListenerManager.setConfiguredEventListener(EventListenerManager.java:82)
at com.facebook.presto.eventlistener.EventListenerManager.loadConfiguredEventListener(EventListenerManager.java:67)
at com.facebook.presto.server.PrestoServer.run(PrestoServer.java:132)
at com.facebook.presto.server.PrestoServer.main(PrestoServer.java:67)
'''
'''
2018-11-07T10:31:14.624-0800 ERROR main com.facebook.presto.server.PrestoServer org.apache.atlas.utils.AuthenticationUtil.isKerberosAuthenticationEnabled(Lorg/apache/hadoop/security/UserGroupInformation;)Z
java.lang.NoSuchMethodError: org.apache.atlas.utils.AuthenticationUtil.isKerberosAuthenticationEnabled(Lorg/apache/hadoop/security/UserGroupInformation;)Z
at org.apache.atlas.AtlasBaseClient.getClient(AtlasBaseClient.java:283)
at org.apache.atlas.AtlasBaseClient.initializeState(AtlasBaseClient.java:436)
at org.apache.atlas.AtlasBaseClient.<init>(AtlasBaseClient.java:164)
at org.apache.atlas.AtlasClientV2.<init>(AtlasClientV2.java:106)
at com.eventbrite.integral.atlas.ApacheAtlasClient.setupAtlasClient(ApacheAtlasClient.java:43)
at com.eventbrite.integral.atlas.ApacheAtlasClient.getInstance(ApacheAtlasClient.java:23)
at com.eventbrite.integral.presto.handlers.HandleSelect.<clinit>(HandleSelect.java:33)
at com.eventbrite.integral.presto.PrestoQueryHandler.createDispatcher(PrestoQueryHandler.java:80)
at com.eventbrite.integral.presto.PrestoQueryHandler.<init>(PrestoQueryHandler.java:49)
at com.eventbrite.integral.presto.PrestoEventListener.<init>(PrestoEventListener.java:42)
at com.eventbrite.integral.presto.PrestoEventListenerFactory.create(PrestoEventListenerFactory.java:19)
at com.facebook.presto.eventlistener.EventListenerManager.setConfiguredEventListener(EventListenerManager.java:82)
at com.facebook.presto.eventlistener.EventListenerManager.loadConfiguredEventListener(EventListenerManager.java:67)
at com.facebook.presto.server.PrestoServer.run(PrestoServer.java:132)
at com.facebook.presto.server.PrestoServer.main(PrestoServer.java:67)
'''
After including jersey core and container dependencies, I get the below error.
'''
2018-11-07T10:56:03.709-0800 ERROR main com.facebook.presto.server.PrestoServer ClassCastException: attempting to castjar:file:/usr/lib/presto/lib/javax.ws.rs-api-2.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class to jar:file:/data/presto/plugin/presto-event-listener/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class
java.lang.LinkageError: ClassCastException: attempting to castjar:file:/usr/lib/presto/lib/javax.ws.rs-api-2.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class to jar:file:/data/presto/plugin/presto-event-listener/javax.ws.rs-api-2.0.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:146)
at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:120)
at javax.ws.rs.core.MediaType.valueOf(MediaType.java:179)
at com.sun.jersey.core.header.MediaTypes.<clinit>(MediaTypes.java:64)
at com.sun.jersey.core.spi.factory.MessageBodyFactory.initReaders(MessageBodyFactory.java:182)
at com.sun.jersey.core.spi.factory.MessageBodyFactory.initReaders(MessageBodyFactory.java:176)
at com.sun.jersey.core.spi.factory.MessageBodyFactory.init(MessageBodyFactory.java:162)
at com.sun.jersey.api.client.Client.init(Client.java:343)
at com.sun.jersey.api.client.Client.access$000(Client.java:119)
at com.sun.jersey.api.client.Client$1.f(Client.java:192)
at com.sun.jersey.api.client.Client$1.f(Client.java:188)
at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
at com.sun.jersey.api.client.Client.<init>(Client.java:188)
at com.sun.jersey.api.client.Client.<init>(Client.java:171)
at org.apache.atlas.AtlasBaseClient.getClient(AtlasBaseClient.java:273)
at org.apache.atlas.AtlasBaseClient.initializeState(AtlasBaseClient.java:413)
at org.apache.atlas.AtlasBaseClient.<init>(AtlasBaseClient.java:148)
at org.apache.atlas.AtlasClientV2.<init>(AtlasClientV2.java:106)
at com.eventbrite.integral.atlas.ApacheAtlasClient.setupAtlasClient(ApacheAtlasClient.java:43)
at com.eventbrite.integral.atlas.ApacheAtlasClient.getInstance(ApacheAtlasClient.java:23)
at com.eventbrite.integral.presto.handlers.HandleSelect.<clinit>(HandleSelect.java:33)
at com.eventbrite.integral.presto.PrestoQueryHandler.createDispatcher(PrestoQueryHandler.java:80)
at com.eventbrite.integral.presto.PrestoQueryHandler.<init>(PrestoQueryHandler.java:49)
at com.eventbrite.integral.presto.PrestoEventListener.<init>(PrestoEventListener.java:42)
at com.eventbrite.integral.presto.PrestoEventListenerFactory.create(PrestoEventListenerFactory.java:19)
at com.facebook.presto.eventlistener.EventListenerManager.setConfiguredEventListener(EventListenerManager.java:82)
at com.facebook.presto.eventlistener.EventListenerManager.loadConfiguredEventListener(EventListenerManager.java:67)
at com.facebook.presto.server.PrestoServer.run(PrestoServer.java:132)
at com.facebook.presto.server.PrestoServer.main(PrestoServer.java:67)
'''
I was intially directed to fix it by using a classloader safe implementation of EventListener, which I have done. The EventListenerFactory instantiates an instance of my original EventListener implementation, and passes it to a ClassLoaderSafeEventListener along with the thread classloader. The ClassLoaderSafeEventListener uses the instance as a delegate, and calls the delegate's methods after wrapping each as below:
'''
public class ClassLoaderSafeEventListener
implements EventListener
{
private final EventListener delegate;
private final ClassLoader classLoader;
public ClassLoaderSafeEventListener(EventListener delegate, ClassLoader classLoader)
{
this.delegate = requireNonNull(delegate, "delegate is null");
this.classLoader = requireNonNull(classLoader, "classLoader is null");
}
@Override
public void queryCreated(QueryCreatedEvent queryCreatedEvent)
{
try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) {
delegate.queryCreated(queryCreatedEvent);
}
}
@Override
public void queryCompleted(QueryCompletedEvent queryCompletedEvent)
{
try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) {
delegate.queryCompleted(queryCompletedEvent);
}
}
@Override
public void splitCompleted(SplitCompletedEvent splitCompletedEvent)
{
try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) {
delegate.splitCompleted(splitCompletedEvent);
}
}
}
'''
I'm still getting the above error, and i do not know what i should do next. Any help is greatly appreciated.