我正在构建具有多个重度依赖项的Spark应用程序(例如带有语言模型的Stanford NLP),因此包含具有依赖项的应用程序代码的uber Jar需要大约500MB。将这个胖Jar上传到我的测试集群需要花费很多时间,我决定将我的应用程序和依赖项构建到单独的Jar文件中。
我在我的父pom.xml中创建了两个模块,分别用mvn package
和mvn assembly:asembly
构建app和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) 在 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)at org.apache.hadoop.hdfs.DFSClient。(DFSClient.java:601)at at 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(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文件?
答案 0 :(得分:0)
我的火花工作遇到了相同的问题。这肯定是一个依赖性问题。您必须确保在运行时选择了正确的版本。执行此操作的最佳方法是将正确版本的hadoop-common-2.6.jar添加到我的应用程序jar中。我还在应用程序jar中升级了hadoop-hdfs版本。这解决了我的问题。