相关文章推荐
读研的盒饭  ·  《血源诅咒:沉睡的终焉》漫画细节解析(2) ...·  1 年前    · 
彷徨的骆驼  ·  反映校园热点,展现青春风采!深圳实验学校微电 ...·  1 年前    · 
有情有义的匕首  ·  食品学院师生参加中国食品科学青年论坛并与西南 ...·  1 年前    · 
好帅的棒棒糖  ·  【宾利飞驰PHEV报价】宾利飞驰PHEV最新 ...·  1 年前    · 
天涯  ·  为了用apple ...·  4 年前    · 
Code  ›  Spark常见错误问题汇总开发者社区
spark 数据处理 executor shuffle
https://cloud.tencent.com/developer/article/1665711
威武的单杠
1 年前
作者头像
王知无-import_bigdata
0 篇文章

Spark常见错误问题汇总

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 大数据成神之路 > 正文

Spark常见错误问题汇总

发布 于 2020-07-21 14:14:48
2.5K 0
举报

一.SparkSQL相关

  • 在执行insert 语句时报错,堆栈信息为:FileSystem closed。常常出现在ThriftServer里面。
    • 原因:由于hadoop FileSystem.get 获得的FileSystem会从缓存加载,如果多线程一个线程closedFileSystem会导致该BUG
    • 解决方法:hdfs存在不从缓存加载的解决方式,在hdfs-site.xml 配置 fs.hdfs.impl.disable.cache=true即可
  • 在执行Spark过程中抛出:Failed to bigdata010108:33381,caused by:java.nio.channels.unresolvedAdderssException
    • 原因:该原因是由于hosts未配置,导致不识别
    • 解决方法:修改相应的机器的host即可
  • 在执行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包。
  • Saprk-sql和ThriftServer使用时报错:Java.net.socketTimeOutException:read time out
    • 原因:是由于hivemetastore过于繁忙或者gc导致连接超时
    • 解决方法:spark-sql解决:hive.metastore.client.socket.timeout将该参数调大。ThriftServer解决办法:在获得一个Connection之前加上:DriverManager.setLoginTimeout(100)
  • 操作snappy压缩的表时抛出:java.lang.RuntimeException: native snappy library not available: this version of libhadoop was built without snappy support.
    • 原因:是由于没有在java.library.path上加上snappy库
    • 解决方法:修改spark-default.conf配置文件加上:spark.executor.extraLibraryPath /data/Install/hadoop/lib/native 或者spark.executor.extraJavaOptions -Djava.library.path=/data/Install/hadoop/lib/native
  • Spark-sql在执行时将一个很小的文件拆分成了20个task进行运行,导致运行速度太慢。
    • 原因:是由于HaddopRDD生成过程中partitions是会拿参数mapreduce.job.maps ,或mapred.map.tasks(20)和spark默认分区数(2)做最大值比较,所以导致默认为20
    • 解决方法:修改该参数就可以将task降下来。
  • ThriftServer登录异常:javax.security.sasl.AuthenticationException: Error validating LDAP user
    • 原因:是由于密码错误或者LDAP服务异常
    • 解决方法:解决密码和验证问题
  • 使用jdbc的方式连接到ThriftServer,可以执行类似与show tabls的等操作,但是不能执行select相关的操作:java.io.IOException: Failed to create local dir in /tmp/blockmgr-adb70127-0a28-4256-a205-c575acc74f9d/06.
    • 原因:用户很久没使用ThriftServer导致系统清理了该上级目录或者用户根本就对该目录没有写权限
    • 解决方法:重启ThriftServer和设置目录权限:spark.local.dir
  • 在Spark SQL中运行的SQL语句过于复杂的话,会出现 java.lang.StackOverflowError 异常
    • 原因:这是因为程序运行的时候 Stack 大小大于 JVM 的设置大小
    • 解决方法:通过在启动 Spark-sql 的时候加上 --driver-java-options “-Xss10m” 选项解决这个问题
  • INSERT INTO重复执行出现:Unable to move source hdfs://bigdata05/tmp/hive-hduser1101_hive_2017-09-11_14-50-56_038_2358196375683362770-82/-ext-10000/part-00000 to destination hdfs://bigdata05/user/hive
    • 原因:该问题是2.1.0的Bug,在Spark2.1.1中已经解决2.1.0。
    • 解决方法:2.1.0规避办法INSERT OVERWRITE不带分区重复执行不会出现问题
  • 执行 大数据 量的join等操作时出现:1.Missing an output location for shuffle;2.Failed to connect to bigdata030015/100.103.131.13:38742; 3.FileNotFoundException……(not such file or directory)。4.Container killed on request. Exit code is 143
    • 原因:shuffle分为shuffle write和shuffle read两部分。shuffle write的分区数由上一阶段的RDD分区数控制,shuffle read的分区数则是由Spark提供的一些参数控制。shuffle write可以简单理解为类似于saveAsLocalDiskFile的操作,将计算的中间结果按某种规则临时放到各个executor所在的本地磁盘上。
      • shuffle read的时候数据的分区数则是由spark提供的一些参数控制。可以想到的是,如果这个参数值设置的很小,同时shuffle read的量很大,那么将会导致一个task需要处理的数据非常大。结果导致JVM crash(OOM),从而导致取shuffle数据失败,同时executor也丢失了,看到Failed to connect to host的错误,也就是executor lost的意思。有时候即使不会导致JVM crash也会造成长时间的gc
    • 解决方法:1. 调优sql。
      • 2.SparkSQL和DataFrame的join,group by等操作通过spark.sql.shuffle.partitions控制分区数,默认为200,根据shuffle的量以及计算的复杂度提高这个值。
      • 3.Rdd的join,groupBy,reduceByKey等操作,通过spark.default.parallelism控制shuffle read与reduce处理的分区数,设置大一点。
      • 4.通过提高executor的内存设置spark.executor.memory适当提高executor的memory值。
      • 5.判断join过程中是否存在数据倾斜的问题:可以参考链接:https://tech.meituan.com/spark-tuning-pro.html
  • Sparksql使用过程中Executor端抛出:java.lang.OutOfMemoryError: GC overhead limit exceeded
    • 原因:这是由于大部分事件都在GC,导致OOM。
    • 解决方法:加大执行器内存,修改GC策略spark.executor.extraJavaOptions -XX:+UseG1GC
  • hiveserver2和SparkThriftServer使用操作orc表的时候报错A用户无法访问B用户的目录。
    • 原因:这是由于orc 在进行Split过冲中会进行用户缓存。ORC在hive1.2.1时的BUG,在hive2.X和Spark2.3.X版本后进行了解决
    • 解决方法:暂时规避方法比较暴力,1、先使用超级用户进行第一次查询,导致缓存的用户为超级用户。2、设置hive.fetch.task.conversion=none不进行缓存
  • spark-sql在使用过程中小数据量查询很慢,查看sparkUI显示每个Task处理都很快,但是都隔了3秒进行调度导致整体很慢。
    • 原因:这是由于数据本地性导致的,默认spark.locality.wait为3秒
    • 解决方法:设置该参数为0即可加快速度,只有在数据量较小的情况下才建议这样设置。

二.Spark core相关

  • on yarn启动spark-sql 和spark-submit时出现:java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig
    • 原因:和yarn相关Jersey包冲突
    • 解决方法:配置上–conf spark.hadoop.yarn.timeline-service.enabled=false
  • 在使用Spark过程中出现:java.io.IOException: No space left on device
    • 原因:一般是由于Spark的tmp目录满了导致
    • 解决方法:可以将该目录空间设置大点,支持按逗号分割多个目录:spark.local.dir
  • 超出最大结果集:is bigger than spark.driver.maxResultSize (2.0GB)
    • 原因:spark.driver.maxResultSize默认配置为1G
    • 解决方法:调大该参数即可
  • 常见OOM:java.lang.OutOfMemoryError: Java heap space
    • 原因:1、数据量太大,申请的Executor资源不足以支撑。2.单分区的数据量过大,和分区数过多导致执行task和job存储的信息过多导致Driver OutOfMemoryError
    • 解决方法:1、尽量不要使用collect操作。2、查看数据是否有倾斜,增加shuffle的并行度,加大Executor内存
  • 由Executor的FullGC引起Executor lost,task失败,各种超时:Futures timed out after【120S】
    • 原因:一般是由于Executor处理数据量过大如倾斜导致,从而使Executor full gc导致时间超时,Executor 和 task 的lost
    • 解决方法:1、如果通过查看Executor的日志是full GC导致,适当调优SQL,加大Executor内存。2、如果没有fullGC考虑提高:spark.network.timeout
  • jar包版本冲突时:java.lang.ClassNotFoundException: XXX
    • 原因:一般可能是用户jar和Spark jar冲突
    • 解决方法:1、最好和Spark相关的jar进行适配。2、如果不行可以使用参数:spark.driver.userClassPathFirst和spark.executor.userClassPathFirst 设置为true
  • 进行shuffle抛出:Shuffle Fetch Failed: OOM
    • 原因:Shuffle fetch阶段开启的fetch数据量过大导致
    • 解决方法:1、加大Executor内存。2、将参数spark.reduce.maxSizeInFlight调小,默认48M
  • shuffle报org.apache.spark.shuffle.FetchFailedException: Direct buffer memory
    • 原因:堆外内存不够导致,直接内存
    • 解决方法:增大JVM 参数-XX:MaxDirectMemorySize(如:spark.executor.extraJavaOptions = -XX:MaxDirectMemorySize=xxxm)
  • 集群节点异常导致Spark job失败,如磁盘只读。
    • 原因:Spark 是一个高性能、容错的分布式计算框架,一旦它知道某个计算所在的机器出现问题会依据之前生成的 lineage 重新在这台机器上调度这个 Task,如果超过失败次数就会导致job失败。
    • 解决方法:Spark有黑名单机制,在超出一定次数的失败后不会往该节点或者Executor调度Task。设置相应Black参数:spark.blacklist.enabled=true

三.Pyspark相关

  • driver python和Executor Python版本不一致问题
    • 原因:pyspark要求所有的Executor运行的python版本一致
    • 解决方法:指定python的运行路径:spark.pyspark.python /data/Install/Anaconda2Install/Anaconda3-5.1.0/bin/python 或者 env配置上:export PYSPARK_PYTHON=/data/Install/Anaconda2Install/Anaconda3-5.1.0/bin/python;export PYSPARK_DRIVER_PYTHON=/data/Install/Anaconda2Install/Anaconda3-5.1.0/bin/python
  • Pyspark使用过程中出现:RDD时出现序列化pickle.load(obj)报错,EOFError。有时可以,在local也可以。
    • 原因:在on yarn时,机器上也有安装相关的Spark。导致包冲突
    • 解决方法:删除nodeManager上的Spark安装路径就可以解决
  • 运行RDD操作时报Randomness of hash of string should be disabled via PYTHONHASHSEED mean in pyspark
    • 原因:这是由于各个Executor的Hash随机值不一样导致。
    • 解决方法:只需要指定各Executor的PYTHONHASHSEED环境变量即可如:–conf spark.executorEnv.PYTHONHASHSEED=321

四.Streaming相关

  • 消费kafka时,第一个job读取了现有所有的消息,导致第一个Job处理过久甚至失败
    • 原因:auto.offset.reset设置为了earliest 从最早的offset开始进行消费,也没有设置spark.streaming.kafka.maxRatePerPartition参数
    • 解决方法:指定从之前开始消费的数据开始:设置offsetRange。并将参数设置为:auto.offset.reset=latest 设置Spark每个分区的速率。
  • 尽量使用高性能算子
    • 使用reduceByKey/aggregateByKey替代groupByKey
    • 使用mapPartitions替代普通map
    • 使用foreachPartitions替代foreach
    • 使用filter之后进行coalesce操作
    • 使用repartitionAndSortWithinPartitions替代repartition与sort类操作
  • Streaming如果存在多个Batch延迟时,消费不过来。有时会报出:Hbase相关的异常如:RegionTooBusyException
    • 原因:Streaming在进行处理时如果单个Batch读取的数据多,会导致计算延迟甚至导致存储组件性能压力
    • 解决方法:1、如果是计算延迟试着调整读取速率如:spark.streaming.kafka.maxRatePerPartition参数 2、调优存储组件的性能 3、开启Spark的反压机制:spark.streaming.backpressure.enabled,该参数会自动调优读取速率。但是如果设置了spark.streaming.receiver.maxRate 或 spark.streaming.kafka.maxRatePerPartition,那么最后到底接收多少数据取决于三者的最小值
  • 消费kafka时,读取消息报错:OffsetOutOfRangeException
    • 原因:读取的offsetRange超出了Kafka的消息范围,如果是小于也就是kafka保存的消息已经被处理掉了(log.retention.hours)。或者超出Kafka现有的offset
    • 解决方法:在读取offset时先进行校正,拿到offset的earliestOffset 和lastestOffset
  • Kafka抖动导致No leader found
    • kafka变更或者其他原因导致
    • 解决方法:设置 spark.streaming.kafka.maxRetries 大于1

未完待续。

点击展开阅读全文
文章分享自微信公众号:
大数据技术与架构
大数据技术与架构

扫码关注公众号

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

原始发表:2020-07-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

大数据
node.js
spark
java
linux
登录 后参与评论
关于作者
0
文章
0
累计阅读量
0
获赞
前往专栏
关注 - 腾讯云 开发者 公众号
将获得
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
扫码关注腾讯云开发者
NEW
切换旧版
领券
  • 社区

    • 专栏文章
    • 阅读清单
    • 互动问答
    • 技术沙龙
    • 技术视频
    • 团队主页
    • 腾讯云TI平台
  • 活动

    • 自媒体分享计划
    • 邀请作者入驻
    • 自荐上首页
    • 技术竞赛
  • 资源

    • 技术周刊
    • 社区标签
    • 开发者手册
    • 开发者实验室
  • 关于

    • 社区规范
    • 免责声明
    • 联系我们
    • 友情链接

腾讯云开发者

扫码关注腾讯云开发者

扫码关注腾讯云开发者

领取腾讯云代金券

热门产品

  • 域名注册
  • 云服务器
  • 区块链服务
  • 消息队列
  • 网络加速
  • 云数据库
  • 域名解析
  • 云存储
  • 视频直播

热门推荐

  • 人脸识别
  • 腾讯会议
  • 企业云
  • CDN加速
  • 视频通话
  • 图像分析
  • MySQL 数据库
  • SSL 证书
  • 语音识别

更多推荐

  • 数据安全
  • 负载均衡
  • 短信
  • 文字识别
  • 云点播
  • 商标注册
  • 小程序开发
  • 网站监控
  • 数据迁移

Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有

深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569

腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287

问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档
 
推荐文章
读研的盒饭  ·  《血源诅咒:沉睡的终焉》漫画细节解析(2) | 机核 GCORES
1 年前
彷徨的骆驼  ·  反映校园热点,展现青春风采!深圳实验学校微电影荣获大奖
1 年前
有情有义的匕首  ·  食品学院师生参加中国食品科学青年论坛并与西南大学食品学院深入交流-四川农业大学食品科学与工程实验教学中心
1 年前
好帅的棒棒糖  ·  【宾利飞驰PHEV报价】宾利飞驰PHEV最新报价_宾利飞驰PHEV多少钱-搜狐汽车
1 年前
天涯  ·  为了用apple care的免费换新使劲用ipad,两年内将电池容量降到80%以下可行吗? - 知乎
4 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号