Spark相关常见问题汇总

一.SparkSQL相关

问题一 unresolvedAdderssException

  • 在执行Spark过程中抛出:Failed to bingdate001:33381,caused by:java.nio.channels.unresolvedAdderssException

  • 原因:该原因是由于hosts未配置,导致不识别

  • 解决方法:修改相应的机器的host即可

问题二 IndexOutOfBoundsException

  • 在执行Sparksql操作orc类型的表时抛出:java.lang.IndexOutOfBoundsException 或者 java.lang.NullPointerException

  • 原因:分区或者表下存在空的orc文件。该BUG在Spark2.3.0之后才修复

  • 解决方法:规避解决。修改ORC的默认分割策略为:hive.exec.orc.split.strategy=BI进行解决。Orc的分split有3种策略(ETL、BI、HYBIRD),默认是HYBIRD(混合模式,根据文件大小和文件个数自动选择ETL还是BI模式),BI模式是按照文件个数来分split。
    Spark2.1.0不支持永久函数,这是由于Spark2.2.0之前不支持读取hdfs上面的jar包。

问题三 socketTimeOutException:read

  • Saprk-sql和ThriftServer使用时报错:Java.net.socketTimeOutException:read time out

  • 原因:是由于hivemetastore过于繁忙或者gc导致连接超时

  • 解决方法:spark-sql解决:hive.metastore.client.socket.timeout将该参数调大。ThriftServer解决办法:在获得一个Connection之前加上:DriverManager.setLoginTimeout(100)

问题四 Spark-sql运行速度太慢

  • Spark-sql在执行时将一个很小的文件拆分成了25个task进行运行,导致运行速度太慢。

  • 原因:是由于HaddopRDD生成过程中partitions是会拿参数mapreduce.job.maps ,或mapred.map.tasks(25)和spark默认分区数(2)做最大值比较,所以导致默认为25

  • 解决方法:修改该参数就可以将task降下来。

问题五 StackOverflowError

  • 在Spark SQL中运行的SQL语句过于复杂的话,会出现java.lang.StackOverflowError 异常

  • 原因:这是因为程序运行的时候 Stack 大小大于 JVM 的设置大小

  • 解决方法:通过在启动 Spark-sql 的时候加上 --driver-java-options "-Xss10m" 选项解决这个问题

问题六 OutOfMemoryError

  • Sparksql使用过程中Executor端抛出:java.lang.OutOfMemoryError: GC overhead limit exceeded

  • 原因:这是由于大部分事件都在GC,导致OOM。

  • 解决方法:加大执行器内存,修改GC策略spark.executor.extraJavaOptions -XX:+UseG1GC

二.Spark core相关

问题七 No space left on device

  • 在使用Spark过程中出现:java.io.IOException: No space left on device

  • 原因:一般是由于Spark的tmp目录满了导致

  • 解决方法:可以将该目录空间设置大点,支持按逗号分割多个目录:spark.local.dir

问题八 Java heap space

  • 常见OOM:java.lang.OutOfMemoryError: Java heap space

  • 原因:1.数据量太大,申请的Executor资源不足以支撑。2.单分区的数据量过大,和分区数过多导致执行task和job存储的信息过多导致Driver OutOfMemoryError

  • 解决方法:1、尽量不要使用collect操作。2、查看数据是否有倾斜,增加shuffle的并行度,加大Executor内存

问题九 ClassNotFoundException

  • jar包版本冲突时:java.lang.ClassNotFoundException: XXX

  • 原因:一般可能是用户jar和Spark jar冲突

  • 解决方法:1、最好和Spark相关的jar进行适配。2、如果不行可以使用参数:spark.driver.userClassPathFirstspark.executor.userClassPathFirst 设置为true

三、Streaming相关

问题十 OffsetOutOfRangeException

  • 消费kafka时,读取消息报错:OffsetOutOfRangeException

  • 原因:读取的offsetRange超出了Kafka的消息范围,如果是小于也就是kafka保存的消息已经被处理掉了(log.retention.hours)。或者超出Kafka现有的offset

  • 解决方法:在读取offset时先进行校正,拿到offset的earliestOffset 和lastestOffset

问题十一 消费kafka

  • 消费kafka时,第一个job读取了现有所有的消息,导致第一个Job处理过久甚至失败

  • 原因auto.offset.reset设置为了earliest 从最早的offset开始进行消费,也没有设置spark.streaming.kafka.maxRatePerPartition参数

  • 解决方法:指定从之前开始消费的数据开始:设置offsetRange。并将参数设置为:auto.offset.reset=latest 设置Spark每个分区的速率。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脸ル粉嘟嘟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值