记2018最后一次问题诊断-Spark on Yarn所有任务运行失败

  2018的最后一个工作日,是在调式和诊断问题的过程中度过,原本可以按时下班,毕竟最后一天了,然鹅,确是一直苦苦挣扎。

  废话不多说,先描述一下问题:有一套大数据环境,是CDH版本的,总共4台机子,我们的应用程序与大数据集群之前已经集成完毕,调试没有问题,可以运行Spark任务。而与这个集群集成是17年下半年的事了,这次升级后,发现无法正确的执行任务,不管是程序提交的还是用示例程序SparkPi,或者手动用spark-submit提交,都是执行失败,且Yarn框架调度执行两次。主要错误提示如下:

Diagnostics: java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.isSymlink(Ljava/io/File;)Z

截图如下:

sprak-submit提交客户端日志截图

yarn:8088任务监控页面任务(与上图不是一个任务,但错误信息一致)

  其实,从任务日志错误提示,可以看出,肯定是加载了低版本的包,用了高版本的方法,NoSuchMethod异常再也熟悉不过了,这一点确信后,就需要找这个包在哪里?FileUtils类属于commons-io包,目前有1.4和2.4版本的,其中,1,4中的FileUtils类确实没有isSymlink方法。好了,基本可以确认,程序在使用了这个commons-io-1.4.jar包。

  虽然问题确认,但是还是让人很头疼,因为我可以确认,我们自己的应用程序中,只用了2.4的包。为了排序一些常规影响,我们分别使用cdh自带的sparka提交、使用最简单的SparkPi来运行,但都运行失败,并且我还写了一个搜索类所在的包的工具,来运行排查问题。

package com.meritdata.search.tool;

import java.io.PrintStream;
import java.security.CodeSource;
import java.security.ProtectionDomain;

public class Utils
{
  public static void search(String name)
  {
    try
    {
      Class clazz = Class.forName(name);
      ProtectionDomain pd = clazz.getProtectionDomain();
      CodeSource cs = pd.getCodeSource();
      System.out.println(name + " location: " + cs.getLocation());
    }
    catch (Throwable e) {
      e.printStackTrace();
    }
  }
}
package com.meritdata.search.tool;

public class Search
{
  public static void main(String[] args)
  {
    String name = args[0];
    Utils.search(name);
  }
}

这是最先开始使用的代码,想验证当前任务加载的包是不是有其他的版本,使用提交命令:

%SPARK_HOME%>.\bin\spark-submit.cmd --master --deploy cluster --files hive-site.xml --class com.meritdata.search.tool.Search search.tool-0.0.1-SNAPSHOT.jar org.apache.commons.io.FileUtils

这个任务运行的结果,打印的是commons-io-2.4.jar。确认后再想,是不是其他地方引用,而这个demo比较简单,没有使用到,因为加载顺序不一样,可能会影响。所以,又完善了一下程序:

package com.meritdata.search.tool;

import java.util.Collections;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Encoders;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.SparkSession.Builder;

public class SparkDemo
{
  public static void main(String[] args)
  {
    try
    {
      SparkSession spark = SparkSession.builder().appName("SparkDemo").enableHiveSupport().getOrCreate();
      Dataset dataset = spark.createDataset(Collections.singletonList("test"), Encoders.STRING());
      dataset.show();
      spark.sql("SELECT explode(Array(\"a\", \"b\", \"c\")) as v ").show();
    } catch (Throwable e) {
      e.printStackTrace();
    }

    String name = args[0];
    Utils.search(name);
  }
}

  因为实际中,要使用spark,必须初始化SparkSession,这样运行完成spark的代码后,再看看打印的包名称。但是结果令人意外,在初始化SparkSession的时候,任务就异常了,错误信息如开头提示。这下,我终于确认,是Yarn服务加载了不该加载的jar包,这下,就要排查yarn加载的包了,除过应用自己,yarn还要加载默认的包,hadoop的,hdfs的,yarn的包,配置项为 yarn.application.classpath, 在CDH的配置界面可以搜索到,有默认配置,会加载hadoop的一些基础程序包。首先想到的是,肯定是这个路径下面加载了低版本的包,想清空试试运行,结果还不行,因为有默认值,不填写每用,后来才想到的,因为当时已经调试的懵逼了。

  发现不过后,想着去服务器上面,看看那些地方都有1.4的包,使用搜索命令:

find / -name commons-io-*.jar -type f

  搜索结果如图:

在大数据集群的某个节点搜索到的结果

  从搜索结果来看,在cdn的jars下面有个1.4的包,我想,会不会是这样包引起的呢?但是,我在其他的环境中也发现这个包,不可能是这个包引起的,要不然,都得有问题。既然这个包没有影响,任务加载的包也是正确的,哪到底是哪里的影响了任务的执行?

  此时,这个问题已经搞得人头疼,尝试了却没有发现问题,明明很简单,就包冲突,却无法解决。在领导的提示下,替换1.4中的FileUtils类,看看到底是不是这个包的问题,也不管了,只能试试了,司马当活马医。修改完成,打包,在四个节点搜索所有的1.4包,准备替换。

  突然,发现了一个让人惊喜的意外,在大数据集群的某个节点,在Hadoop的子目录,搜索到了一个1.4的包,而且不是软链接。

  从搜索结果可以看出来,在执行的时候,每个任务下临时目录会复制jar包,hadoop/lib/commons-io-1.4.jar就是这个原因,查看其他节点,均为有类似情况。毫无疑问,删除这个包,重启集群,执行demo,成功,终于松了一口气。不知道是什么原因导致,现场环境复杂,所以也没办法追究,也没有必要,问题出现,就得解决。其实,很早之前,就应该检查四个节点,这样的话,就不会在那瞎想,可以尽早的发现异常包。

  由于是客户现场,调试不方便,同事也比较辛苦,在现场的滋味,我深有体会。问题虽然简单,但是对整理的了解和调试方法也是很重要的,否则,会做很多无用功。

  仅此来纪念和告别2018的辛勤工作,2019继续奋发前行,让自己更强。

本文地址:https://www.cnblogs.com/flowerbirds/p/10205185.html

原文地址:https://www.cnblogs.com/flowerbirds/p/10205185.html

时间: 2024-10-11 01:00:44

记2018最后一次问题诊断-Spark on Yarn所有任务运行失败的相关文章

Spark on YARN两种运行模式介绍

本文出自:Spark on YARN两种运行模式介绍http://www.aboutyun.com/thread-12294-1-1.html(出处: about云开发)   问题导读 1.Spark在YARN中有几种模式? 2.Yarn Cluster模式,Driver程序在YARN中运行,应用的运行结果在什么地方可以查看? 3.由client向ResourceManager提交请求,并上传jar到HDFS上包含哪些步骤? 4.传递给app的参数应该通过什么来指定? 5.什么模式下最后将结果输

Spark on Yarn彻底解密(DT大数据梦工厂)

内容: 1.Hadoop Yarn的工作流程解密: 2.Spark on Yarn两种运行模式实战: 3.Spark on Yarn工作流程解密: 4.Spark on Yarn工作内幕解密: 5.Spark on Yarn最佳实践: 资源管理框架Yarn Mesos是分布式集群的资源管理框架,和大数据没关系,但是可以管理大数据的资源 ==========Hadoop Yarn解析============ 1.Yarn是Hadoop推出的资源管理器,是负责分布式(大数据)集群计算的资源管理的,负

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

2018年前100名Apache Spark面试问题和解答(上)

我们知道Apache Spark现在是一项蓬勃发展的技术.因此,了解Apache Spark的各个方面以及Spark面试问题非常重要.我将介绍Spark的每个方面,这也可能是经常被问到的Spark面试问题.此外,我将尽力提供每个问题,从现在开始,您搜索最佳和所有Spark面试问题将在此结束. Apache Spark面试问题答案 一,什么是Apache Spark? Apache Spark是一个功能强大的开源灵活数据处理框架,围绕速度,易用性和复杂的分析而构建.Apache Spark在集群计

Spark on Yarn年度知识整理

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

Spark on Yarn

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

Spark On YARN内存和CPU分配

本篇博客参考:http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/ 软件版本: CDH:5.7.2,JDK:1.7: 问题描述: 在使用Spark On YARN时(无论是Client模式或者是Cluster模式,当然下面会有这种模式的对比区别),可以添加诸如: --executor-memory 8G --executor-cores 5 --num-executors 20 等等这样的

spark 在yarn执行job时一直抱0.0.0.0:8030错误

近日新写完的spark任务放到yarn上面执行时,在yarn的slave节点中一直看到报错日志:连接不到0.0.0.0:8030 . 1 The logs are as below: 2 2014-08-11 20:10:59,795 INFO [main] org.apache.hadoop.yarn.client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8030 3 2014-08-11 20:11:01,838 INFO [ma

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任务如果使