使用远程 jvm 在纱线集群上提交火花作业时出现异常

Posted

技术标签:

【中文标题】使用远程 jvm 在纱线集群上提交火花作业时出现异常【英文标题】:Exception while submit spark job on yarn cluster with remote jvm 【发布时间】:2015-07-30 04:28:13 【问题描述】:

我正在使用下面的 java 代码在 yarn-cluster 上提交作业。

public ApplicationId submitQuery(String requestId, String query,String fileLocations) 
    String driverJar = getDriverJar();
    String driverClass =  propertyService.getAppPropertyValue(TypeString.QUERY_DRIVER_CLASS);
    String driverAppName = propertyService.getAppPropertyValue(TypeString.DRIVER_APP_NAME);
    String extraJarsNeeded = propertyService.getAppPropertyValue(TypeString.DRIVER_EXTRA_JARS_NEEDED);

      String[] args = new String[] 
               // the name of your application
               "--name",
               driverAppName,

               // memory for driver (optional)
               "--driver-memory",
               "1000M",

               // path to your application's JAR file 
               // required in yarn-cluster mode      
               "--jar",
               "local:/home/ankit/Repository/Personalization/rtis/Cust360QueryDriver/target/SnapdealCustomer360QueryDriver-jar-with-selective-dependencies.jar",

               "--addJars",
               "local:/home/ankit/Downloads/lib/spark-assembly-1.3.1-hadoop2.4.0.jar,local:/home/ankit/.m2/repository/org/slf4j/slf4j-api/1.7.5/slf4j-api-1.7.5.jar,local:/home/ankit/.m2/repository/org/slf4j/slf4j-log4j12/1.7.5/slf4j-log4j12-1.7.5.jar",


               // name of your application's main class (required)
               "--class",
               driverClass,

               "--arg",
               requestId,

               "--arg",
               query,

               "--arg",
               fileLocations,

               "--arg",
               "yarn-client"
           ;

      System.setProperty("HADOOP_CONF_DIR", "/home/hduser/hadoop-2.7.0/etc/hadoop");
      Configuration config = new Configuration();
      config.set("yarn.resourcemanager.address", propertyService.getAppPropertyValue(TypeString.RESOURCE_MANGER_URL));
      config.set("fs.default.name", propertyService.getAppPropertyValue(TypeString.FS_DEFAULT_NAME));

      System.setProperty("SPARK_YARN_MODE", "true");



      SparkConf sparkConf = new SparkConf();

      ClientArguments cArgs = new ClientArguments(args, sparkConf); 

      // create an instance of yarn Client client
       Client client = new Client(cArgs, config, sparkConf);

       ApplicationId id = client.submitApplication();

       return id;


作业正在提交到 yarn-cluster,我能够检索应用程序 ID,但在 spark 集群上运行作业时我遇到了异常。

 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/Logging
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.Logging
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 13 more

虽然在 /home/ankit/Downloads/lib/spark-assembly-1.3.1-hadoop2.4.0.jar 中提到了类。看起来 --addJars 中提到的 jar 没有被添加到驱动程序的 spark 上下文中。

我做错了什么吗?任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您是否在 Cloudera 的发行版上进行部署? CDH 5.4 配置中的 spark.yarn.jar 对本地文件有一个“local:”前缀,但 Spark 版本 >= 1.5 不喜欢这样,你应该只使用你的 spark 程序集的完整路径名。另见here。

【讨论】:

【参考方案2】:

尝试构建不依赖于 spark 的 JAR,并在 spark 提交中使用 --jars 传递依赖的 jar。大多数时候 ClassNotFoundException 是由于 spark 而应用程序本身依赖于同一个 jar。 建议的解决方案:

    没有依赖的打包,在过程中用--jars添加依赖的jar 火花提交 修改应用程序以使用相同版本的第三方 spark 的库 在构建工具中使用阴影

【讨论】:

以上是关于使用远程 jvm 在纱线集群上提交火花作业时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

在火花代码管理 conf.setMaster() 使用配置文件自动设置本地或纱线集群

在火花提交作业中读取镶木地板文件时出现内存不足错误

当资源不足时,火花作业将等待来自纱线的资源多长时间?

在远程 Yarn 集群上使用 spark 从 S3 访问文件时出现问题

AWS EMR 火花提交选项 - 失败

如何在 Amazon EMR 集群上远程提交 hadoop MR 作业