当前spark任务都是运行在yarn上,所以不用启动长进程worker,也没有master的HA问题,所以主要的问题在任务执行层面。
作业故障分类
故障主要分为版本,内存和权限三方面。
- 各种版本不一致
- 各种内存溢出
- 其他问题
版本不一致
#####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
4) spark版本不一致
报错:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.SparkContext.assertNotStopped()at org.apache.spark.sql.SparkSession.<init>(SparkSession.scala:80)
处理:检查bash和spark-env.sh中的SPARK_HOME,看是不是目标版本,如果不是就修改。这个问题在spark新老版本迁移中可能出现。
- hive metastore与spark的编译hive版本不一致(spark sql 插入语句失败)
报错:
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to alter table. Invalid method name: 'alter_table_with_cascade' Caused by: org.apache.thrift.TApplicationException: Invalid method name: 'alter_table_with_cascade'
解决方法:任务启动加参数 --conf spark.sql.hive.metastore.version=“0.14.0” --conf spark.sql.hive.metastore.jars=maven
在hdfs上创建文件,并在SPARK_HOME/conf/hive-site.xml设置对应参数:hive.exec.stagingdir值为/tmp/hive/spark-${user.name}
该参数权限设置为777
这个maven涉及包有~/.m2 ~/.ivy2的jar文件
参考:https://discourse.looker.com/t/fixing-spark-default-metastore-and-hive-metastore-mismatch-issues-prior-to-looker-3-44/2123
内存问题
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,出现这个错误。</