我在Hortonworks Distribution 2.4上(实际上是hadoop 2.7.1和spark 1.6.1)
我在超级jar(2.1.0)中打包我自己的spark版本,而群集在1.6.1上。在这个过程中,我通过一个胖罐(使用maven - uber jar概念构建)发送所有必需的库。
但是,spark zh_cn(通过spark 2.1.0客户端)在引擎客户端上引用NoClassFound错误失败。在列出我的超级jar内容后,我可以在jar中看到确切的类文件,仍然火花/纱线无法找到它。
这里 - 错误消息 -
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig
at org.apache.hadoop.yarn.client.api.TimelineClient.createTimelineClient(TimelineClient.java:55)
at org.apache.hadoop.yarn.client.api.impl.YarnClientImpl.createTimelineClient(YarnClientImpl.java:181)
at org.apache.hadoop.yarn.client.api.impl.YarnClientImpl.serviceInit(YarnClientImpl.java:168)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.spark.deploy.yarn.Client.submitApplication(Client.scala:151)
at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:56)
at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:156)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:509)
at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2313)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:868)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:860)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:860)
这是我尝试在jar文件中找到该类 -
jar -tf uber-xxxxx-something.jar | grep jersey | grep ClientCon
com/sun/jersey/api/client/ComponentsClientConfig.class
com/sun/jersey/api/client/config/ClientConfig.class
......其他档案
这可能会发生什么?建议?想法请.. ..
修改 pom的jersey客户端部分在这里 -
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19.3</version>
</dependency>
修改 我还想指出这一点,我的代码是用Scala 2.12编译的,兼容级别设置为2.11。但是,群集可能在2.10。我的意思是,因为我认为群集节点不一定必须安装Scala二进制文件; YARN只是在不使用Scala二进制文件的情况下启动组件的jar / class文件。想知道那是否在这里发挥作用!!!