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

Sean Owen commented on SPARK-1693:
----------------------------------

I think this is traceable to a case of jar conflict. I am not sure whether the 
ultimate cause is signing, but it doesn't matter, since we should simply 
resolve the conflict. (But I think something like that may be at play, since 
one of the problem dependencies is from Eclipse's jetty, and there is an 
Eclipse cert in the manifest at META-INF/ECLIPSEF.RSA...) Anyway.

This is another fun jar hell puzzler, albeit one with a probable solution. The 
basic issues is that Jetty brings in the Servlet 3.0 API:

{code}
[INFO] |  +- org.eclipse.jetty:jetty-server:jar:8.1.14.v20131031:compile
[INFO] |  |  +- 
org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:compile
{code}

... but in Hadoop 2.3.0+, so does Hadoop client:

{code}
[INFO] |  +- org.apache.hadoop:hadoop-client:jar:2.4.0:compile
...
[INFO] |  |  +- org.apache.hadoop:hadoop-mapreduce-client-core:jar:2.4.0:compile
[INFO] |  |  |  \- org.apache.hadoop:hadoop-yarn-common:jar:2.4.0:compile
[INFO] |  |  |     +- javax.xml.bind:jaxb-api:jar:2.2.2:compile
...
[INFO] |  |  |     +- javax.servlet:servlet-api:jar:2.5:compile
{code}

Eclipse is naughty for packaging the same API classes in a different artifact, 
rather than just using javax.servlet:servlet-api 3.0. There may be a reason for 
that, which is what worries me. In theory Servlet 3.0 is a superset of 2.5, so 
Hadoop's client should be happy with the 3.0 API on the classpath.

So solution #1 to try is to exclude javax.servlet:servlet-api from the 
hadoop-client dependency. It won't affect earlier versions at all since they 
don't have this dependency, and therefore need not even be version-specific.

Hadoop 2.3+ then in theory should happily find Eclipse's Servlet 3.0 API 
classes and work as normal. I give that about an 90% chance of being true.

Solution #2 is more theoretically sound. We should really exclude Jetty's 
custom copy of Servlet 3.0, and depend on javax.servlet:servlet-api:jar:3.0 as 
a runtime dependency. This should transparently override Hadoop 2.3+'s version, 
and still work for Hadoop. Messing with Jetty increases the chance of another 
snag. Probability of success: 80%


Li would you be able to try either of those ideas?

> Most of the tests throw a java.lang.SecurityException when spark built for 
> hadoop 2.3.0 , 2.4.0 
> ------------------------------------------------------------------------------------------------
>
>                 Key: SPARK-1693
>                 URL: https://issues.apache.org/jira/browse/SPARK-1693
>             Project: Spark
>          Issue Type: Bug
>          Components: Spark Core
>            Reporter: Guoqiang Li
>            Assignee: Guoqiang Li
>         Attachments: log.txt
>
>
> {code}mvn test -Pyarn -Dhadoop.version=2.4.0 -Dyarn.version=2.4.0 > 
> log.txt{code}
> The log: 
> {code}
> UnpersistSuite:
> - unpersist RDD *** FAILED ***
>   java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s 
> signer information does not match signer information of other classes in the 
> same package
>   at java.lang.ClassLoader.checkCerts(ClassLoader.java:952)
>   at java.lang.ClassLoader.preDefineClass(ClassLoader.java:666)
>   at java.lang.ClassLoader.defineClass(ClassLoader.java:794)
>   at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
>   at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
>   at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
>   at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
>   at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
>   at java.security.AccessController.doPrivileged(Native Method)
>   at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
> {code}



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to