spark2.0.1使用过程中常见问题汇总

当前spark任务都是运行在yarn上,因为不用启动长进程worker,也没有master的HA问题,所以出现的主要问题会在任务执行层面。

作业故障分类

故障主要分为版本,内存和权限三方面。
- 各种版本不一致
- 各种内存溢出
- 其他问题

1.版本不一致

1)java版本不一致
报错:java.lang.UnsupportedClassVersionError: com/immomo/recommend/RedisDao: Unsupported major.minor version 52.0
处理:该问题一般是spark的java版本与作业编译的java版本不一致,建议将本地java版本改为与spark一致的版本(目前集群是1.7.0_71)。

2)scala版本不一致
报错:java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror(Ljava/lang/ClassLoader;)Lscala/reflect/api/
JavaMirrors$JavaMirror;
处理:该报错就是本地使用的scala版本与集群的不一致,建议把本地scala版本替换为集群版本scala 2.11.8
3) 本地jar包跟hdfs远程的不一致
报错:local class incompatible: stream classdesc serialVersionID = -6965587383804958479374, local class serialVersionID = -2231952633394736947
处理:因为spark使用spark.yarn.archive参数上传本地jar包到hdfs来加速job执行过程,所以新编译的spark要运行的话,或者删除这一参数,或者将新编译spark的jar包覆盖集群目录下的。
4) spark版本不一致
报错:Exception in thread “main” java.lang.NoSuchMethodError: org.apache.spark.SparkContext.assertNotStopped()at org.apache.spark.sql.SparkSession.(SparkSession.scala:80)
处理:检查bash和spark-env.sh中的SPARK_HOME,看是不是目标版本,如果不是就修改。这个问题在spark新老版本迁移中可能出现。

2.内存问题

1)GC开销超过限制
报错:java.lang.OutOfMemoryError: GC overhead limit exceeded at scala.collection.immutable.HashMap.scala.collection.immutable.HashMap.makeHashTrieMap(HashMap.scala:175)
处理:分为两个角度,一是是检查代码,减少不必要的冗余,重用的RDD要序列化缓存,减少shuffle数据,加大并行度;二从参数配置看,加大executor内存,增加shuffle buffer缓存,但有时候也因为job写的太低效而出现无效。

2)空指针异常
报错:java.lang.NullPointerException at com.immomo.recommend.recommend_molive$$anonfun$1.apply(recommend_molive.scala:83)、
处理:该问题一般是代码中的,检查数组,对象内容是否可能为空;尤其是表数据,能有字段的值为null,但没有处理null,出现这个错误。

3)kyro 缓存溢出
报错: java.lang.OutOfMemoryError: Java heap space at com.esotericsoftware.kryo.io.Output.require(Output.java:168)
处理:该报错堆栈可以看到是kyro请求空间,结果不够出现溢出,因为kyro序列化器能序列化的单个对象最大限制为spark.kryoserializer.buffer.max定义,这个值最大为2g。所以建议优先检查代码中的大对象,想办法裁剪对象大小,如果不行再考虑增大spark.kryoserializer.buffer.max数值。

4)driver端数据溢出
报错:Job aborted due to stage failure: Total size of serialized results of 334502 tasks (1024.0 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)
处理:对于collect和一些操作,driver会接收各task执行后的数据,spark.driver.maxResultSize参数控制接收数据大小,建议先检查代码,避免或减少take,collect操作,如果不成功再考虑增大该参数。

3.其他问题

1)代码不规范
报错:org.apache.spark.SparkException: This RDD lacks a SparkContext. It could happen in the following cases:
(1) RDD transformations and actions are NOT invoked by the driver, but inside of other transformations; for example, rdd1.map(x => rdd2.values.count() * x) is invalid because the values transformation and count action cannot be performed inside of the rdd1.map transformation. For more information, see SPARK-5063.
处理:这个报错是因为RDD的transformation中嵌套transformation或action,导致计算失败,可以先从报错那一行找到嵌套的trans或action操作,把这个操作拿出来运算。

2)磁盘临时文件空间不足
报错:java.io.IOException: No space left on device
处理:在shuffle过程中,中间文件都放在/tmp目录,当shuffle文件达到磁盘空间上限,就报错。解决方法可以增大executor个数,分担压力,如果仍不可以的话就联系平台同学配置spark-default.conf中设置spark.local.dir(默认是/tmp)为磁盘空间足够的目录即可解决。在yarn模式则配置LOCAL_DIRS。

3)文件没有访问权限
报错:Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=dm, access=EXECUTE, inode=”/user/hadoop/.sparkStaging/application_1480755301936_1884”:hadoop:supergroup:drwx——

处理:查看这个job是什么用户执行,要确定任务执行的权限,一般是使用其他组件调用,导致执行用户变化,导致没有文件权限。

 来源:一只小白的大数据之路  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值