我正在构建具有多个严重依赖项的 Spark 应用程序(例如,具有语言模型的斯坦福 NLP),因此包含具有依赖项的应用程序代码的 uber Jar 需要大约 500MB。将这个胖 Jar 上传到我的测试集群需要很多时间,我决定将我的应用程序和依赖项构建到单独的 Jar 文件中。
我在我的父 pom.xml 中创建了两个模块,mvn package
并mvn assembly:asembly
分别使用 和 构建应用程序和 uber jar。
但是,在我将这些单独的 jar 上传到我的 YARN 集群应用程序后,应用程序失败并出现以下错误:
线程“main”中的异常 java.lang.NoSuchMethodError: org.apache.hadoop.net.unix.DomainSocketWatcher.(I)V at org.apache.hadoop.hdfs.shortcircuit.DfsClientShmManager.(DfsClientShmManager.java:415) at org .apache.hadoop.hdfs.shortcircuit.ShortCircuitCache.(ShortCircuitCache.java:379) 在 org.apache.hadoop.hdfs.ClientContext.(ClientContext.java:100) 在 org.apache.hadoop.hdfs.ClientContext.get(ClientContext .java:151) 在 org.apache.hadoop.hdfs.DFSClient.(DFSClient.java:690) 在 org.apache.hadoop.hdfs.DFSClient.(DFSClient.java:601) 在 org.apache.hadoop.hdfs。 DistributedFileSystem.initialize(DistributedFileSystem.java:148) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2653) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:92)
在 Spark 上运行应用程序时,它也会失败并出现类似错误。
带有依赖项的 Jar 包含在 Yarn 类路径中:
<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 文件?