Spark报错异常及解决
- org.apache.spark.shuffle.FetchFailedException
- Container killed by YARN for exceeding memory limits.
- Container on host: xxx was preempted
- org.apache.spark.SparkException: Task not serializable
- spark session行报错: java.lang.NullPointerException
- java.sql.SQLException: Operation not allowed after ResultSet closed
org.apache.spark.shuffle.FetchFailedException
org.apache.spark.shuffle.FetchFailedException: Connecting to xxx timed out (120000 ms)
原因:数据读取过多
结果:导致stage失败,然后重试
解决:暂无
Container killed by YARN for exceeding memory limits.
原因:内存处理数据量过大,executor内存不足
结果:当前task失败
解决:
- 调高executor内存的配额
- 增加spark.yarn.executor.memoryOverhead
--conf spark.yarn.executor.memoryOverhead=4096 (注意这里的单位是MB)
Container on host: xxx was preempted
https://blog.csdn.net/weixin_39750084/article/details/107637667
原因:有task占用的内存太大,而我们的yarn又是使用的公平调度机制,当有新任务来的时候,我的task对应的容器就会被别的任务抢占。
结果:task失败重试,失败次数很多后会产生FetchFailedException错误,导致stage失败
解决(maybe):避免资源紧张;减少不必要的数据,或者减少不必要的关联/操作,避免一个task中数据过多;改yarn的参数了,让资源抢占的门限值变高些。
org.apache.spark.SparkException: Task not serializable
Caused by: java.io.NotSerializableException: com.google.gson.Gson
Serialization stack:......
java.io.NotSerializableException是因为你试图序列化一个不可序列化的对象。在这个例子中,com.google.gson.Gson对象是不可序列化的。
问题定位:
def executeDiffLayer(dataDf: DataFrame): DataFrame = {
val gson = new Gson()
val changeDf = dataDf
.map(row => {
val value = row.getAsmutable.WrappedArray[String].map(gson.fromJson(, classOf[xxx])).toList
(value)
}).toDF()
}
在Spark中,map函数中的所有对象都需要被序列化以便在网络中传输。但是Gson对象是不可序列化的,所以在运行时会抛出NotSerializableException异常。
解决:
将Gson对象的创建放在map函数中,这样每次在executor上执行map函数时,都会创建一个新的Gson对象,而不需要将Gson对象序列化传输。
spark session行报错: java.lang.NullPointerException
val rowsRDD = session.sparkContext.parallelize(rowsList)
spark的session竟然也会报空指针?明明import了session为什么还会空指针?
排查:
经过排查发现,session本身并不是null,说明session本身创建没有问题。但是session.getContext是空,session没法获取到上下文。
问题定位:
在executor内(repartition内),使用session进行createDataFrame等操作。
解决:
spark session是spark下发任务进行指挥的工具,只能在driver上使用,不能在executor上使用。需要将executor的结果收集,然后在driver上使用spark session。
java.sql.SQLException: Operation not allowed after ResultSet closed
本次Spark任务中通过建立数据库连接,从数据库中查询数据,在小批量数据验证时一切正常。当数据量大了以后,会出现上述错误。
排查:
错误描述看起来是connection的创建和关闭不正确,但是:1. 小数据量没问题证明连接开关逻辑正确,2. connectoin均有开有关
问题定位:
怀疑是连接超时失败导致connection处理异常,正在使用的connection突然中断
解决:
将connection的timeout时间变大