Spark报错异常及解决

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失败
解决:

  1. 调高executor内存的配额
  2. 增加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时间变大

### 解决 Spark 中出现的 `ClassCastException` 错误及原因分析 #### 原因分析 在处理 Scala 和 Java 类型转换时,可能会遇到 `ClassCastException`。具体来说,在尝试将 Scala 集合类型强制转换为 Java 集合类型时容易出现问题。例如,当试图把 `scala.collection.mutable.WrappedArray$ofRef` 转换为 `java.util.List` 时就会抛出异常[^2]。 这种类型的错误通常发生在混合使用 Scala 和 Java API 的场景下,尤其是在集合操作上。Scala 提供了自己的集合库,而这些集合类并不直接继承自 Java 的相应接口或基类,因此无法简单地通过强转实现互操作性。 #### 解决策略 为了防止此类异常的发生,建议采用以下几种方式: - **显式转换** 利用 Scala 库提供的工具函数来进行安全可靠的双向转换。可以引入隐式转换机制来简化代码编写过程: ```scala import scala.collection.JavaConverters._ val listInJava: java.util.List[Int] = List(1, 2, 3).asJava ``` 上述例子展示了如何利用 `JavaConverters._` 将 Scala 的列表对象转化为 Java 的 `List` 实现。 - **避免混用不同语言的标准库组件** 如果项目主要基于某种编程语言开发,则应尽可能保持一致性,减少跨平台API之间的交互频率。对于需要共享的数据结构部分,考虑定义统一的数据传输模型(DTO),并为其提供专门的序列化/反序列化工厂方法。 - **升级依赖版本** 确认所使用的 Spark 版本以及相关第三方库均为最新稳定版。某些旧版本可能存在已知缺陷,更新至较新版本或许能够解决问题。 - **检查配置项设置** 对于运行环境而言,确保 JVM 参数合理设定也很重要。特别是针对内存管理方面,适当调整堆外空间大小有助于缓解潜在的对象创建压力,从而降低发生 OOM 或者其他形式的内存溢出风险[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值