Spark问题排查方式

一次spark写入hbase延时问题的排查 总结一下工作中遇到一次spark写入hbase的超时问题。 业务场景是将kafka等数据源采集上来的用户日志数据经spark汇聚到hbase,然后再读出来供排序、算法评分等业务使用。先前使用时并未出现超时问题,但最近突然就出现了写入超时,下图中是spark任务调度ui页面,可以看出多个写入任务的时延明显增长。 最一开始是怀疑hbase集群出现问题,于是查找各个regionser 阅读详情

Spark问题排查思路

  1. 历史任务报错的常见原因
    1. 集群变更。例如JAR包版本冲突,环境改动,部分task集中在变更的节点导致重试次数超限,变更时间过长超过任务容错时间等。前两者需要追查异常原因,后两者一般可通过重跑解决
    2. 数据异常。例如数据倾斜、数据量激增、脏数据等
    3. 资源紧张,包括队列资源紧张(结合Yarn队列资源监控),和节点资源紧张(节点CPU、io、内存等)。后者常见于Spark Shuffle异常和task启动异常
    4. 集群bug,包括Spark和上下游组件等可能出现的bug,常表现为任务卡住,需结合task堆栈信息排查
  2. 新任务问题主要集中在用户的使用不当和环境匹配上,常见的包括
    1. 没有显示调用stop()方法结束(SparkSession.stop() 或 SparkContext.stop()),导致任务挂起
    2. 调用System.exit()方法退出,导致Spark无法执行正常的清退逻辑,状态异常
    3. JAR包版本冲突。常见于用户同集群环境共同依赖的jar包版本不一致,如protobuf,commons等包。这种情况可以考虑通过参数优先加载用户jar包——spark.driver.userClassPathFirst=true,spark.executor.userClassPathFirst=true
    4. 参数配置不合理。例如开发测试环境和生产环境的数据量不是一个级别,因此有些可以在开发测试环境使用的配置参数无法适用于生产环境
    5. Spark版本不一致,例如用户使用了更高版本的特性(常见于AI团队)

常见问题

内存问题

现象

driver/executor日志中出现java.lang.OutOfMemoryError或者driver日志中出现executor xxx Lost, exit code 137/143

解决方法

  • 增加driver/executor 内存
  • 调整shuffle分区数量 rdd对应spark.default.parallelism,sql/dataframe操作对应spark.sql.shuffle.partitions这两个值默认为200
  • 有的SQL任务会使用mapjoin/broadcastjoin等hint,由于原始表的数据很大,会出现即使driver增加很多内存,但是driver依然OOM,这个时候需要去掉mapjoin/broadcastjoin等hint
  • SQL任务存在In子查询,例如insert into table xxx select * from yyy where id in( select id from zzz),3.2.0里面这种语句会走动态分区裁剪,类似broadcast导致driver OOM,这个时候要禁止动态分区裁剪

    spark.sql.optimizer.dynamicPartitionPruning.enabled=false 

网络超时

现象

常见以下报错

  1. failed to fetch shuffle partition xxxx ,connection closed,该问题是因为execcutor长时间没有接收到ESS发送到的数据导致的
  2. heartbeat timeout,executor向driver发送心跳信息,由于网络原因导致driver无法接收到heartbeat,有可能executor会被认为Lost
  3. register shuffle xxxx timeout,该问题是由于shuffletask需要将任务注册到ESS,这个动作有超时时间

解决方法

对应以上的序列号

  1. 可以调整网络的超时时间spark.network.timeout=600s(默认120s)
  2. 可以调整心跳发送间隔spark.executor.heartbeatInterval=60s(默认10s),以及调整spark.network.timeout=600s
  3. 该问题可以增加注册超时时间spark.shuffle.registration.timeout=30000(默认5000)

任务卡住或者执行的太慢

现象

  1. 任务层面 scan表的时候split太多(几万十几万)会导致task频繁的分配、注册、启动的时间的等待
  2. join类型的选择
  3. 用户代码导致
  4. 用户的函数使用system.out输出可能会导致任务很慢
  5. Spark bug导致

解决方法

对应以上的序列号

  1. 该问题以有两点,SQL任务scan表的方式,可以通过SparkUI界面的DAG看出,如果是filesourcescan,那么可以调整spark.sql.files.maxPartitionBytes=268435456(默认256M);如果是hivetablescan,如果小文件太多的话,在spark里面会一个split一个文件,这个太多的scan task也会导致任务变慢,现在可以配置spark.sql.hiveCombine=true,然后调整spark.hadoop.mapreduce.combinesplit.size=67108864(默认64M),参考:https://blog.youkuaiyun.com/Samooyou/article/details/131601269?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22131601269%22%2C%22source%22%3A%22Samooyou%22%7D
  2. join类型当前在SQL任务中如果没有添加关于join的hint的话,默认一般会选择sortmergejoin,如果有的表太小还会出现broadcastjoin,当时sortmergejoin比较慢,这个时候可以选择hashjoin,hashjion可以通过配置spark.sql.join.preferSortMergeJoin=false,该参数join类型不在倾向于是使用sortmergejion
    spark.sql.adaptive.maxShuffledHashJoinLocalMapThreshold=134217728(128M),join分区的数据量限制,因为要吧数据放到内存,所以要加上限制
    spark.sql.adaptive.advisoryPartitionSizeInBytes=67108864(64M),该参数要小于spark.sql.adaptive.maxShuffledHashJoinLocalMapThreshold
  3. 查看task的堆栈,判断执行的代码一直运行用户的代码,可判定是用户代码问题,需要结合代码调整(最近一例:用户将一个array 作为broadcast,后面在map算子中调用这个broadcast 判断array是否包含对应的值,由于array.contains是通过iterator一条一条的迭代,所以效率非常低,后续将array修改为map)
  4. 该问题让用户注释掉输出代码
  5. 如果代码卡在spark的代码,那应该是spark的问题,移交给spark负责人处理

类加载冲突

现象

任务中,jar包中是存在依赖的,但是依然出现NoClassFoundException或者NoSuchMethodExeption等问题

解决方法

有两个参数可以调整driver/executor的类加载顺序

spark.driver.userClassPathFirst=true 该参数仅在cluster模式下才能正常使用 

spark.executor.userClassPathFirst=true

ESS何时关闭

上述提到的shuffle timeout, register timout都是因为ESS繁忙或者网络问题引起的,有些情况下ESS关闭是可以避免这些问题的,ESS关闭后

使用的就是当前Spark任务内嵌的shuffle服务,由于是一对一的服务,所以timeout是不容易出现的,那么什么时候关闭呢。

非SQL任务,并且关闭了动态分配,配置为固定的executor,这个时候是可以关闭ESS的,通过spark.shuffle.service.enabled=false

来关闭ESS,但是任务内部的shuffle服务的线程数默认是executor cores的个数,可能会引起性能的下降,所以同时需要提升该参数

spark.shuffle.io.serverThreads=8

PySpark问题

PySpark出现比较多的是使用的问题,可以参考pyspark脚手架

MaxCompute Spark 使用和常见问题 简介: 本文将就MaxCompute Spark开发环境搭建、常用配置、作业迁移注意事项以及常见问题进行深入介绍。 一. MaxCompute Spark 介绍 MaxCompute Spark是MaxCompute提供的兼容开源的Spark计算服务。它在统一的计算资源和数据集权限体系之上,提供Spark计算框架,支持用户以熟悉的开发使用方式提交运行Spark作业,以满足更丰富的数据处理分析场景。 1.1 关键特性 支持原生多版本Spark作业 社区原生Spark运行在MaxCompute里.. 阅读详情

相关推荐

Spark 处理中文乱码问题(UTF-8编码)

问题场景 要用spark处理一大堆微信日志数据,日志存放在HDFS上,是xml格式,里面有大量的中文。用scala + java实现了xml的处理逻辑,其中有一步是要获取xml中的一个title字段,中文。不管怎么抓取,最终得到的中文都会变成一堆“?????”,乱码了。从xml中获取非中文字段,没有任何问题。也就是说,代码的逻辑是没什么问题的。

Amber_amber的专栏 3万+

一次Spark SQL线上问题排查和定位

全网最全大数据面试提升手册!背景 该sql运行在spark版本 3.1.2下的thrift server下现象 在运行包含多个union 的spark sql的时候报错(该sql包含了50多个uinon,且每个union字查询中会包含join操作),其中union中子查询sql类似如下:SELECTa1.order_no ,a1...

微信搜:import_bigdata,大数据领域硬核原创作者 1253

CentOS7.5搭建spark2.3.1集群

一 下载安装包 1 官方下载 官方下载地址:http://spark.apache.org/downloads.html 2  安装前提 Java8         安装成功 zookeeper  安装参考:CentOS7.5搭建Zookeeper3.4.12集群 hadoop       安装参考:CentOS7.5搭建Hadoop2.7.6集群 Scala          ...

Frank409167848的博客 2159

SparkUI超详细解释(7)——Debug

如果想看一个任务在不同时间点占用的executor数量,应该看numExistingExecutors数量,需要注意的是executor数量并不能等同于CU的用量,一方面是一个executor可能占用更多内存换算成CU会占用更多的CU,还可能是一个executor会占用多个core(通过设置spark.executor.cores)也会占用更多的CU。为方便用户查看任务执行期间申请的Executor数量,Spark UI增加了Debug页面。

2301_77818583的博客 675

Spark:java.lang.ClassNotFoundException: computePI$$anonfun$1

使用IDEA远程提交jar到spark集群出错:java.lang.ClassNotFoundException: computePI$$anonfun$1 这个问题困扰了我很长时间,我大概花费了三四天的时间,不停的找问题,不停的找原因,经过不断的尝试才发现原因所在。 具体的报错信息如下: 20/12/07 08:32:33 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, 172.17.0.3, executor 2): java.lan

weixin_44546992的博客 674

Spark读取HDFS加密区数据乱码问题解决

因为项目需求,需要启用hdfs加密区,为了验证对现有程序的影响,我在自己的集群上配置了加密区,并测试spark和java程序读取数据。 spark程序代码如下 System.setProperty("HADOOP_USER_NAME", "user1") val spark = SparkSession .builder() .master("local") .getOrCreate() // val data = spark.read.

piduzi的博客 717

spark问题与排查

1、spark thriftserver报以下错误,其他诸如hive/sparksql等方式均正常 ERROR ActorSystemImpl: Uncaught fatal error from thread [sparkDriverActorSystem-akka.actor.default-dispatcher-379] shutting down ActorSystem [sparkDr

6339

避坑指南:ros2_control在Gazebo中的常见配置错误及解决方案

本文系统梳理了在Gazebo仿真环境中配置ros2_control框架时最常见的错误,并提供了详细的解决方案。重点解析了YAML配置文件的结构陷阱、URDF/XACRO中关键标签的正确写法、Launch文件的启动顺序管理,并分享了实用的调试命令与故障排查思路,帮助开发者高效避坑,实现流畅的关节运动控制。

q5r6s7的博客 968

SparkOnYarn 调用System.exit(0)状态异常 与 scala获取当前活跃线程

一.引言: 在yarn-cluster模式下运行spark程序时,出现任务结束但是显示程序没有退出的情况,在本地和yarn上尝试System.exit(0),本地可以正常退出但是在集群模式下无法正常退出并显示Application状态为Failed。 二.本地运行 => 不加入System.exit(x) sc.stop() 在之加入 sc.stop() 的情况下,程序未直接退出,只能手动关闭任务。 => 加入System.exit(x) sc.stop() ..

BITDDD小栈 2387

ESP32-CAM与TFT屏幕实时图像传输:Arduino环境下的OV2640驱动实践

本文详细介绍了在Arduino环境下实现ESP32-CAM与TFT屏幕实时图像传输的完整实践方案。重点解析了OV2640摄像头的驱动配置、硬件引脚连接、TFT屏幕初始化及图像显示优化技巧,帮助开发者快速构建稳定的实时图像显示系统,适用于物联网监控、门禁系统等场景。

cuda7parallel的博客 113

Windows 11下JDK 21与JMeter 5.6.3环境配置全攻略

环境变量是操作系统管理软件路径与执行权限的核心机制,它通过预设的键值对,指引系统在调用命令时定位可执行文件。理解其工作原理,是解决软件安装后“命令未找到”等问题的关键。对于Java生态而言,正确配置JAVA_HOME和Path变量,不仅能让java、javac等基础命令全局可用,更是Maven、Gradle乃至JMeter等众多工具链顺畅运行的基石。JMeter作为一款基于Java开发的经典性能测试与接口测试工具,其稳定运行高度依赖健全的Java环境。本文聚焦于在Windows 11系统上,为JDK 21与

weixin_30940783的博客 449

Spark入门介绍

Spark是什么? Spark的简单介绍 Spark是一个通用的集群计算平台,可用于多种不同场景的分布式应用平台,如批处理、流处理、交互式查询、迭代算法等。Spark是一个对集群上的应用进行分发、调度、监控的计算引擎,他有着速度快和通用的特点。它的接口也非常丰富,提供了Python、Java、Scala和SQL的简单易用的API,Spark可以运行在Hadoop集群上,和其它大数据工具结合使用...

Beson's Blog 253

在STM32上运行小波变换及神经网络算法——(一)单片机中小波算法编写

在单片机上实现离散小波变换的C代码,通过确定信号长度、小波分解层数、小波基名称后进行编写,并改写成了方便调用的结构体格式。

weixin_45400202的博客 986

spark日志配置及问题排查方式。

此文已由作者岳猛授权网易云社区发布。欢迎访问网易云社区,了解更多网易技术产品运营经验。任何时候日志都是定位问题的关键,spark也不会例外,合适的配置和获取spark的driver,am,及executor日志将会提升问题定位的效率,这里初步整理了spark的一些配置,更好的日志配置还需要根据实际的情况。1)dirver日志的配置,可以通过spark.driver.extraJavaOptions...

weixin_33950035的博客 552

告别手册!S32K3XX的eMIOS实战:从GPT定时到PWM输出,一个通道搞定电机控制

本文深入探讨了NXP S32K3XX系列MCU的eMIOS模块在电机控制中的高效应用。通过单通道实现PWM生成、输入捕获和定时中断三大功能,展示了如何简化BLDC电机控制硬件设计。文章结合RTD库与寄存器级编程,提供动态模式切换和性能优化方案,显著降低CPU负载。

weixin_42522374的博客 145

A股量化实战:用Python回测动量因子策略(附聚宽完整代码)

本文详细介绍了如何在A股市场使用Python和聚宽平台,实战回测一个动量因子量化交易策略。从环境搭建、数据获取到完整的策略代码实现与回测分析,手把手教你验证“强者恒强”的投资逻辑,并提供参数优化与实战避坑指南,助力量化新手迈出第一步。

weixin_29264201的博客 967

spark教程

spark教程汇总

yuhouwucaihong的博客 870

AMD锐龙笔记本隐藏玩法:分核降压+ PBO2超频全攻略(以5900HX/6900HX为例)

本文详细解析了AMD锐龙笔记本(以5900HX/6900HX为例)的分核降压与PBO2超频技术,帮助用户释放处理器隐藏性能。通过BIOS设置、Curve Optimizer参数调整及稳定性测试,实现性能提升与温度控制的完美平衡,适合硬件爱好者进阶调校。

weixin_30617737的博客 341

Spark 极速回顾

Spark回顾

qq_46242326的博客 750

【新能源汽车测试工程师必看!DBC文件50条实战技巧,看懂这篇直接封神】

如果你是新能源汽车研发/测试工程师,还在为信号解析错误、报文找不到、DBC看不懂、实车故障复现不了头疼——那这篇文章,你一定要!在整车电控开发里,DBC = CAN总线的官方字典。没有DBC,报文就是一串乱码;读不懂DBC,测试寸步难行;用不好DBC,排查故障全靠猜。本文总结50条全网最实用、最贴近实车、最能解决问题的DBC技巧,从基础语法到新能源专用信号,从工具操作到故障排错,全部来自一线台架、实车、高压平台实战经验。不废话、不空谈、不玄学,全是能直接落地的硬货!

优快云-新能源汽车研发测试专业博主 1365

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【报错处理】MR/Spark 使用 BulkLoad 方式传输到 HBase 发生报错: NullPointerException

【报错处理】MR/Spark 使用 BulkLoad 方式传输到 HBase 发生报错: NullPointerException

Jweilai 498

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

故障解决:spark 访问hive 库、表报错 org.apache.spark.sql.AnalysisException: Table or view not found

1、spark项目 + 外部配置文件【最优,如CDH平台,配置改变,无需重新编译、打包】 2、spark项目(resources目录下存放hive-site.xml)【次之,如果配置变动需要更新配置文件,重新编译打包】 3、spark项目(在代码中写死配置选项)【最差,涉及配置修改后,需要对代码修改,然后重新编译打包】 ...

认知 行动 坚持 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spark & Hive 关于parquet格式文件的区别

因为数据之前一直都在MySQL库中保存,现在需要将部分数据移到hive库中,由于数据在MySQL是分库分表存储的,试了很多方式直接从MySQL到Hive库中都没有成功,于是,采用spark读取MySQL数据输出到parquet文件中,再load到Hive中,这才遇到了这个问题。 将spark输出的parquet文件按分区load到hive中,出现load到hive中的字段比...

搬砖の隔壁老王 2922

解惑:在Ubuntu18.04.2的idea上运行Scala支持的spark程序遇到的问题

解惑:在Ubuntu18.04.2的idea上运行Scala支持的spark程序遇到的问题 一、前言 最近在做一点小的实验,用到了Scala,spark这些东西,于是在Linux平台上来完成,结果一个最简单的入门程序搞了一两天,出了汗颜之外,对于这些工具的难用性也有了深刻的认知,难怪Hadoop的几个公司会渐渐走向衰落。 二、解惑 如果大家看过我之前的博客就知道,我是用过H...

weixin_30765577的博客 892
上一篇: Python-ldap的API使用
下一篇: spark3新特性之动态分区裁剪
Samooyou
博客等级 码龄6年 3827粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值