spark的异常处理:ClassNotFoundException

背景说明

我们做了个私有化的项目,客户提供了三台物理机。利用这三台机器,我们搭建了Kubernetes和Hadoop(包含yarn)且每台物理机上配置了相同的HADOOP_HOME、YARN_HOME JAVA_HOME。后端服务是kubernetes里的Deployment,且需要通过spark-submit的形式提交spark任务至yarn上。

背景大抵如此,故事便从此处开始吧!


一、问题描述

  1. 私有化部署完成的那天下午,我们激动地跑着测试脚本,行云流水,心情舒畅,想着要下班了,爽,奈何一段错误,打乱了我的思绪。。。(完,在公司测试好好的,怎么到这儿就不能用了)
  2. 报错截图:java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.JobID

二、排查过程

  1. 检查网络,查看各个物理机是否可以与pod进行通信。(检查原因:spark设置了driver.host为pod的ip
    1. 获取pod的ip,pod里执行 hostname -i
    2. 各个物理机ping pod的ip
  2. 在pod里多次运行后,发现问题都出在 zbygpu-worker01 这台主机
  3. 检查pod里spark配置,发现物理机zbygpu-worker01的HADOOP_HOME、YARN_HOME、 JAVA_HOME配置与spark的配置不一致

三、解决方案

  1. 在zbygpu-worker01机器上创建软链,使得HADOOP_HOME、YARN_HOME、 JAVA_HOME三个路径与其他物理机以及pod里spark配置保持一致
    sudo mkdir -p /usr/bin/hadoop/software/
    sudo ln -s /home/xxx/jdk1.8.0_181 /usr/bin/hadoop/software/java
    sudo ln -s /home/xxx/hadoop /usr/bin/hadoop/software/hadoop
    sudo ln -s /home/xxx/hadoop /usr/bin/hadoop/software/yarn
    

四、问题原因

  1. pod里spark客户端的 HADOOP_HOME、 YARN_HOME、JAVA_HOME路径与物理机(zbygpu-worker01)的路径不一致
  2. 物理机上能成功的原因在于物理机上spark客户端的三个HOME配置与其他两台机器的配置完全一致

五、总结

这个故事告诉我

  1. 对于有集群的环境来说,一定要保证(包括容器内)配置的一致性,包括但不限于
    1. 环境变量
    2. 关键包的路径
    3. 用户权限(用户名称、用户组权限等)
    4. 时间、时区的一致
    5. 应用包的版本
  2. 多留意报错的细节,如果只关注”java.lang.ClassNotFoundException“,而忽略了”问题都出在 zbygpu-worker01 “,也许很难找到解决办法
  3. 引起”java.lang.ClassNotFoundException“这个报错的原因有很多,我希望看到文章的你,更能在我的”排查过程“得到一些启发

好了,今天的故事到此告一段落,如果对你有所帮助,希望能一键三连,期待下次与你的相遇。

 

你可能感兴趣的:(大数据,大数据,hadoop,spark)