我正在构建spark应用程序,它有几个很重的依赖项(例如带有语言模型的stanford nlp),因此包含依赖项的应用程序代码的uber jar需要大约500mb。将这个胖jar上传到我的测试集群需要很多时间,我决定将我的应用程序和依赖项构建到单独的jar文件中。
我在我的父pom.xml中创建了两个模块,分别用 mvn package
以及 mvn assembly:asembly
分别。
但是,在我将这些单独的jar上传到yarn cluster之后,应用程序失败,出现以下错误:
线程“main”java.lang.nosuchmethoderror中出现异常:org.apache.hadoop.net.unix.domainsocketwatcher。(i)v位于org.apache.hadoop.hdfs.shortcircuit.dfsclientshmmanager.(dfsclientshmmanager)。java:415)在org.apache.hadoop.hdfs.shortcircuit.shortcircuitcache。java:379)在org.apache.hadoop.hdfs.clientcontext。java:100) 在org.apache.hadoop.hdfs.clientcontext.get(clientcontext。java:151)在org.apache.hadoop.hdfs.dfsclient。java:690)在org.apache.hadoop.hdfs.dfsclient。java:601)位于org.apache.hadoop.hdfs.distributedfilesystem.initialize(distributedfilesystem)。java:148)在org.apache.hadoop.fs.filesystem.createfilesystem(filesystem。java:2653)在org.apache.hadoop.fs.filesystem.access$200(文件系统)。java:92)
在spark上运行应用程序时,它也会失败,并出现类似的错误。
包含依赖项的jar包含在类路径中:
<property>
<name>yarn.application.classpath</name>
<value>
$HADOOP_CONF_DIR,
$HADOOP_COMMON_HOME/*,
$HADOOP_COMMON_HOME/lib/*,
$HADOOP_HDFS_HOME/*,
$HADOOP_HDFS_HOME/lib/*,
$HADOOP_MAPRED_HOME/*,
$HADOOP_MAPRED_HOME/lib/*,
$YARN_HOME/*,
$YARN_HOME/lib/*,
/usr/local/myApp/org.myCompany.myApp-dependencies.jar
</value>
</property>
实际上有可能这样运行spark应用程序吗?或者我必须把所有对yarn(或spark)类路径的依赖作为单独的jar文件?
1条答案
按热度按时间mec1mxoz1#
我的spark工作也遇到了同样的问题。这肯定是一个依赖性问题。您必须确保在运行时获取正确的版本,最好的方法是将正确的版本hadoop-common-2.6.jar添加到我的应用程序jar中。我还在applicationjar中升级了hadoophdfs版本。这解决了我的问题。