Oozie Spark on YARN requirement failed

软件环境:

CDH:5.7.3;Oozie:4.1.0-CDH5.7.3 ; Spark:1.6.0-cdh5.7.3-hadoop2.6.0-cdh5.7.3 ; Hadoop:hadoop2.6.0-cdh5.7.3(HDFS 采用HA方式);

问题描述:

在使用CDH5.7.3版本的时候,发起一个Oozie工作流,该工作流使用Spark On YARN的方式提交一个Spark程序,但是在Oozie中该程序运行失败,同时找到YARN监控中对应的任务,发现出现下面的错误(该Spark任务如果使用spark-submit --master yarn的方式是可以提交并正确运行的):

解决思路:

1. 首先就是各种网上找

不过并没有找到相关的信息,找到一些,不过和我出现的问题有点不一样(有个论坛上好像说是bug);

2. 查看源码

准备环境,查看其源码,看是哪个地方报的Requirement failed,在上图中红色框里面就是对应的内容,其源代码如下所示:

而require函数如下:

这里面就会有提示 requirement failed

那么也就是说在473行中的localizedPath等于null,这样子,那么473行的require函数验证就不会通过,就会报这个异常了;localizedPath是怎么得到的呢?

这个是通过distribute函数得到,distribute函数里面的参数file其实是用户提交的参数addJars、files、archives这三个参数,分别对应哪些内容呢?(以下是YARN任务日志截图):

从上面的提交参数来看,由于files和archives都是null,那么就肯定不是这两个参数的问题,那jars这个参数是怎么得到的呢?这个参数是oozie的sharelib里面的jar,但是这个参数值往后一直找发现其结果很多,而且还有以file开头的,也就是说也会有本地的jar包;如下:

那么肯定就是这里的问题了!

初步猜测,可能是Oozie在网这个里面添加jar包的时候添加多了,所以才会有本地的jar包被添加,那么试着修改job.properties里面的参数:

#oozie.use.system.libpath=true
oozie.libpath=${nameNode}/user/oozie/share/lib/lib_20161222004831/spark

采用第二行的方式,而非第一行的方式(第二行中的lib_2016...是时间戳,每个集群应该不一样);

结果使用这种方式依然不行,还是报同样的错误;

那么看看到底是处理哪个jar包路径出问题呢?怎么做?

修改Client源码的第473行,添加一行打印:

val cachedSecondaryJarLinks = ListBuffer.empty[String]
    List(
      (args.addJars, LocalResourceType.FILE, true),
      (args.files, LocalResourceType.FILE, false),
      (args.archives, LocalResourceType.ARCHIVE, false)
    ).foreach { case (flist, resType, addToClasspath) =>
      if (flist != null && !flist.isEmpty()) {
        flist.split(‘,‘).foreach { file =>  // add distinct operation to avoid multiple same jars
          val (_, localizedPath) = distribute(file, resType = resType)
          println("fansy: ---->file:"+file)
          require(localizedPath != null)
          if (addToClasspath) {
            cachedSecondaryJarLinks += localizedPath
          }
        }
      }
    }

然后再次查看日志:

发现:1. 提示的行数变为474了,说明源码修改成功;2 . 在提示中发现到file:/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/jets3t-0.9.0.jar

提示完毕,但是这个文件并不是最后一个addJars参数文件,其后还有很多文件,如下:

为什么会是这个文件结束呢?

查找这个文件出现的次数:

会发现这个文件出现了2次,查询这个文件之后的文件发现都是出现了2次,但是之前的文件只出现了一次,这也就是说:

添加的addJars参数有些路径是重复的!

重复的路径经过distribute函数,处理后,第一个参数会被添加,但是重复的其实就没有必要添加了,所以distribute返回的是localizedPath就是null,这也就是为什么验证通不过的原因所在了。

解决方案:

1. 修改源码:

源码中的addjar参数既然得到的有重复的,那么去重就可以了,如下:

val cachedSecondaryJarLinks = ListBuffer.empty[String]
    List(
      (args.addJars, LocalResourceType.FILE, true),
      (args.files, LocalResourceType.FILE, false),
      (args.archives, LocalResourceType.ARCHIVE, false)
    ).foreach { case (flist, resType, addToClasspath) =>
      if (flist != null && !flist.isEmpty()) {
        flist.split(‘,‘).distinct.foreach { file =>  // add distinct operation to avoid multiple same jars
          val (_, localizedPath) = distribute(file, resType = resType)
          println("fansy: ---->file:"+file)
          require(localizedPath != null)
          if (addToClasspath) {
            cachedSecondaryJarLinks += localizedPath
          }
        }
      }
    }

编译该源码(如果自己编译记得去掉那行打印),得到其class,如下:

2. 替换Jar包

(上传、删除注意HDFS权限)

把HDFS上的oozie的sharelib下包含Client的jar包下载下来,这个jar包在我集群中的位置是(注意时间戳):

/user/oozie/share/lib/lib_20161222004831/spark/spark-yarn_2.10-1.6.0-cdh5.7.3.jar

把这个jar包先下载到linux,然后下载到windows;接着删掉HDFS上的该jar包:

hdfs dfs -rm -r /user/oozie/share/lib/lib_20161222004831/spark/spark-yarn_2.10-1.6.0-cdh5.7.3.jar

在windows里面使用winRAR打开下载的spark-yarn_2.10-1.6.0-cdh5.7.3.jar包,并使用编译后的Client的所有class替换对应的class;替换完成后得到该spark jar(可以在这里下载 http://download.csdn.net/detail/fansy1990/9720059 )

然后把该替换后的jar包上传到linux,再通过linux上传到HDFS:

hdfs dfs -put spark-yarn_2.10-1.6.0-cdh5.7.3.jar /user/oozie/share/lib/lib_20161222004831/spark/

再次运行,发现Oozie任务成功运行:

总结:

1. 在使用一些多个框架技术的时候,如果找不到资料解决问题,那么最直接的方式是查看源码;

2. bug无处不在!

分享,成长,快乐

转载请注明blog地址:http://blog.csdn.net/fansy1990

时间: 2024-08-06 07:54:57

Oozie Spark on YARN requirement failed的相关文章

Spark on Yarn年度知识整理

大数据体系结构: Spark简介 Spark是整个BDAS的核心组件,是一个大数据分布式编程框架,不仅实现了MapReduce的算子map 函数和reduce函数及计算模型,还提供更为丰富的算子,如filter.join.groupByKey等.是一个用来实现快速而同用的集群计算的平台. Spark将分布式数据抽象为弹性分布式数据集(RDD),实现了应用任务调度.RPC.序列化和压缩,并为运行在其上的上层组件提供API.其底层采用Scala这种函数式语言书写而成,并且所提供的API深度借鉴Sca

Spark On YARN内存分配

本文转自:http://blog.javachen.com/2015/06/09/memory-in-spark-on-yarn.html?utm_source=tuicool 此文解决了Spark yarn-cluster模式运行时,内存不足的问题. Spark yarn-cluster模式运行时,注意yarn.app.mapreduce.am.resource.mb的设置.默认为1G Spark On YARN内存分配 本文主要了解Spark On YARN部署模式下的内存分配情况,因为没有

Spark源码系列(七)Spark on yarn具体实现

本来不打算写的了,但是真的是闲来无事,整天看美剧也没啥意思.这一章打算讲一下Spark on yarn的实现,1.0.0里面已经是一个stable的版本了,可是1.0.1也出来了,离1.0.0发布才一个月的时间,更新太快了,节奏跟不上啊,这里仍旧是讲1.0.0的代码,所以各位朋友也不要再问我讲的是哪个版本,目前为止发布的文章都是基于1.0.0的代码. 在第一章<spark-submit提交作业过程>的时候,我们讲过Spark on yarn的在cluster模式下它的main class是or

spark on yarn详解

1.参考文档: spark-1.3.0:http://spark.apache.org/docs/1.3.0/running-on-yarn.html spark-1.6.0:http://spark.apache.org/docs/1.6.0/running-on-yarn.html 备注:从spark-1.6.0开始,spark on yarn命令有略微改变,具体参考官方文档,这里以spark 1.3.0集群为主. 2.前期准备 编译spark,参看文档:http://www.cnblogs

Spark记录-Spark on Yarn框架

一.客户端进行操作 1.根据yarnConf来初始化yarnClient,并启动yarnClient2.创建客户端Application,并获取Application的ID,进一步判断集群中的资源是否满足executor和ApplicationMaster申请的资源,如果不满足则抛出IllegalArgumentException:3.设置资源.环境变量:其中包括了设置Application的Staging目录.准备本地资源(jar文件.log4j.properties).设置Applicati

Spark on Yarn with Hive实战案例与常见问题解决

[TOC] 1 场景 在实际过程中,遇到这样的场景: 日志数据打到HDFS中,运维人员将HDFS的数据做ETL之后加载到hive中,之后需要使用Spark来对日志做分析处理,Spark的部署方式是Spark on Yarn的方式. 从场景来看,需要在我们的Spark程序中通过HiveContext来加载hive中的数据. 如果希望自己做测试,环境的配置可以参考我之前的文章,主要有下面的需要配置: 1.Hadoop环境 Hadoop环境的配置可以参考之前写的文章: 2.Spark环境 Spark环

关于org.apache.spark.deploy.yarn.Client类

目录 前言 主要方法 submitApplication createApplicationSubmissionContext getApplicationReport getClientToken verifyClusterResources copyFileToRemote prepareLocalResources distribute setupLaunchEnv createContainerLaunchContext monitorApplication run @(关于org.ap

mllib:Exception in thread &quot;main&quot; org.apache.spark.SparkException: Input validation failed.

当我们使用mllib做分类,用到逻辑回归或线性支持向量机做分类时,可能会出现下面的错误: 15/04/09 21:27:25 ERROR DataValidators: Classification labels should be 0 or 1. Found 3000000 invalid labels Exception in thread "main" org.apache.spark.SparkException: Input validation failed. 由于做调试时

Spark on Yarn

YARN是什么 YARN在hadoop生态系统中的位置 YARN产生的背景 YARN的基本架构 ResourceManager NodeManager ApplicationMaster container Spark On Yarn 配置和部署 编译时包含yarn 基本配置 在没有配置的前提下试下启动spark-shell 可以看到启动没问题 这里问题就来了!!! 下面我们配上来看看 可以看到报错了!!! 应该是资源不足导致的 先重启一下各个进程 $SPARK_HOME/bin/spark-s