本文汇总了使用AnalyticDB for MySQL Spark的常见问题及解决方案。
常见问题概览
如何解决提交Spark应用时,出现User %s do not have right permission [ *** ] to resource [ *** ]报错?
如何解决运行Spark应用时,出现No space left on device或设备上没有空间报错?
如何解决提交Spark应用时,出现Current Query Elastic Resource Failed报错?
如何解决Spark应用日志中出现的ClassNotFound报错?
如何解决Spark应用日志中出现的NoSuchMethod报错?
如何解决Spark SQL应用读内表时,出现No such file or directory报错?
运行Spark应用时,为什么Spark Executor节点会出现Dead?
Spark SQL应用使用SHOW TABLES或SHOW DATABASE命令查询库表时,为什么显示的库表与实际库表不符?
如何查看Spark应用信息?
您可在Spark Jar开发页面,搜索应用ID,查看Spark应用信息。具体操作,请参见Spark开发编辑器。
如何解决提交Spark应用时,出现User %s do not have right permission [ *** ] to resource [ *** ]报错?
原因:当前RAM用户没有调用该接口的权限。
解决方法:按以下步骤为RAM用户添加对应的权限。
如何解决运行Spark应用时,出现No space left on device或设备上没有空间报错?
原因:可能由于Executor本地磁盘不足,导致以上报错。
解决方法:在Spark Jar开发页面的应用列表页签中,单击对应Spark应用操作列的UI,查看Spark UI中Executor的Stderr日志信息。如果Executor本地磁盘不足,可通过配置spark.adb.executorDiskSize参数,增加Spark Executor节点中挂载的额外磁盘容量。具体操作,请参见Spark应用配置参数说明。
当前Executor本地磁盘最大为100Gi。如果本地磁盘已经为100Gi,仍然提示空间不足,可以增加Executor的数量。
如何解决提交Spark应用时,出现Current Query Elastic Resource Failed报错?
原因:通过JDBC方式提交XIHE BSP应用所使用的数据库账号绑定了Job型资源组,资源拉起速度慢,导致应用超时。
解决方法:解除Job型资源组绑定的数据库账号。具体操作,请参见绑定或解绑数据库账号。
如何解决Spark应用日志中出现的ClassNotFound报错?
原因:提交Spark应用时,上传的JAR包缺少类。
解决方法:您可以打开上传的JAR包,检查该类是否存在。
如果是业务相关的类,您需要重新打包,并确保JAR包中含目标类。
如果是第三方JAR包,您可以采用如下两种方式上传:
使用Maven依赖的Shade或Assembly插件,需手动添加所需的依赖包。
将第三方JAR包上传至OSS中,并在提交Spark应用时配置jars参数。详细信息请参见Spark应用开发介绍。
如何解决Spark应用日志中出现的NoSuchMethod报错?
原因:导入的JAR包与Spark冲突,导致以上报错。
解决方法:您可以通过Spark的conf配置参数添加以下配置,在日志中打印类加载过程中涉及的JAR包,从而排查哪些JAR包与Spark冲突。然后通过Maven常见的冲突解决方式Provided和Relocation解决该报错。详情请参见Conf配置参数。
"spark.executor.extraJavaOptions":"-verbose:class",
"spark.driver.extraJavaOptions":"-verbose:class"
如何解决Spark SQL应用读JSON外表(包含日志投递自建)时,出现ClassNotFoundException: org.apache.hadoop.hive.serde2.JsonSerDe报错?
您需下载hive-serde-3.1.2.jar和hive-hcatalog-core-2.3.9.jar并上传至OSS中,在提交Spark SQL应用时添加add jar oss://<testBucketName>/hive-hcatalog-core-2.3.9.jar;add jar oss://<testBucketName>/hive-serde-3.1.2.jar;
语句。
<testBucketName>
需替换为hive-serde-3.1.2.jar和hive-hcatalog-core-2.3.9.jar所在的实际OSS路径。
如何解决Spark SQL应用读内表时,出现No such file or directory报错?
原因:内表热数据默认存储在Worker节点上,而Spark离线读取数据时,会从OSS中读取,此时OSS中没有内表热数据,会导致Spark SQL执行失败。
解决方法:在查询内表热数据前,使用XIHE引擎执行以下SQL修改配置参数,然后手动BUILD表。BUILD完成后再查询该表的热数据。具体操作,请参见BUILD。
SET ADB_CONFIG CSTORE_HOT_TABLE_ALLOW_SINGLE_REPLICA_BUILD=true;
SET ADB_CONFIG ELASTIC_ENABLE_HOT_PARTITION_HAS_HDD_REPLICA=true;
SET ADB_CONFIG ELASTIC_PRODUCT_ENABLE_MIXED_STORAGE_POLICY=true;
运行Spark应用时,为什么Spark Executor节点会出现Dead?
在Spark Jar开发页面,单击目标Spark应用操作列的UI,跳转到对应的Spark UI页面,如果应用失败原因为Failed to connect to /xx.xx.xx.xx:xxxx
,或者在Spark UI页面的Executors页签下出现状态为Dead的Executor节点,则说明Spark Executor节点由于某种原因退出了。进入Spark UI的具体方法,请参见Spark开发编辑器。
原因和解决方法如下:
原因1:
Executor进程使用的内存超出限制。Spark Executor除了JVM本身使用的内存外,还包括堆外内存(Shuffle、Cache),以及Python UDF等使用的内存。容器使用的内存超过了容器允许使用内存的限制,导致Spark进程被kill命令强制终止。此时Driver日志出现如下报错:
ERROR TaskSchedulerImpl: Lost executor xx on xx.xx.xx.xx:The executor with id xx exited with exit code 137.
。解决方法:
调大spark.executor.memoryOverhead参数,该参数表示容器内部非Spark Executor进程可使用的内存容量(单位MB),默认为Executor容器总内存容量的百分之三十。例如您当前配置的Executor规格是Medium(2核8 GB),则容器内部非Spark Executor进程可使用的内存容量默认为是2.4 GB。调整语句如下:
spark.executor.memoryOverhead: 4000MB
原因2:
日志中出现java.lang.OutOfMemoryError的日志。您可在Spark Jar开发页面,单击目标Spark应用操作列的UI,跳转到对应的Spark UI页面,在Executors页签下,查看状态为Dead的Executor节点对应的stderr或stdout日志,查看具体报错原因。
解决方法:
优化Spark应用,避免大内存占用。
调大Executor资源规格(spark.executor.resourceSpec)。
原因3:
集群开启了动态资源分配(spark.dynamicAllocation.enabled),状态为Dead的Executor节点日志中包含Driver commend a shutdown错误信息。
解决方法:
该报错不会影响业务的正常运行,您无需处理。
除上述原因外,如果还有其他报错,您可查看状态为Dead的Executor节点日志。如果报错位置在业务代码中,您需要提交工单联系技术支持解决;其他错误信息,您可以搜索相关报错信息自行解决。
Spark访问外部数据源时,为什么会出现网络连接失败问题?
原因:通过VPC访问外部数据源时未开启ENI。
解决方法:您需在提交的Spark应用中设置spark.adb.eni.enabled
、spark.adb.eni.vswitchId
、spark.adb.eni.securityGroupId
参数,不同数据源数参数的配置方法不同。详情请参见Spark应用配置参数说明和访问外部数据源。
Spark SQL应用使用SHOW TABLES或SHOW DATABASE命令查询库表时,为什么显示的库表与实际库表不符?
您需先确认AnalyticDB for MySQL企业版、基础版及湖仓版集群提交的Spark SQL应用使用的元数据服务版本是否为adb,如果元数据服务版本为adb,您只能看到具有读权限的库表,其他库表无法查看。如果为指定Hive MetaStore的版本,您需排查自建元数据服务的权限和连通性。元数据服务版本信息,请参见Spark应用配置参数说明。
Spark应用为什么提示错误日志oss object 403?
原因1:AnalyticDB for MySQL Spark不支持跨地域读取JAR包或文件。
解决方法:您需排查JAR包和文件所在的OSS Bucket是否与AnalyticDB for MySQL企业版、基础版及湖仓版集群位于同一地域。
原因2:spark.adb.roleArn参数指定的角色没有读取OSS的权限。
解决方法:您需为RAM用户授予对应权限。具体操作,请参见跨账号授权。
原因3:文件地址填写错误。
解决方法:您需在Spark应用代码中填写正确的OSS路径。
原因4:文件与文件之间没有用英文逗号(,)隔开或写成JSON的格式。
解决方法:您需确保Spark应用代码为正确的JSON格式,且多个文件之间用英文逗号(,)分隔。
如何定位Spark应用运行速度变慢的原因?
进入Spark UI的具体方法,请参见Spark开发编辑器。
Spark应用异常导致运行速度变慢,您可以通过如下两种方法排查:
查看Spark Executor节点的状态是否为Dead。
查看方法:
在Spark Jar开发页面,单击目标Spark应用操作列的UI,跳转到对应的Spark UI页面,在Executors页签下,查看Executors列表中Status字段信息。
解决方法:
查看Driver日志,是否有异常信息导致Task终止并重试。
查看方法:
在Spark Jar开发页面,单击目标Spark应用操作列的UI,跳转到对应的Spark UI页面,在Executors页签下,查看Executor ID为driver的stderr日志。
解决方法:
通过日志中的报错信息查看异常的具体原因,大部分异常原因跟业务逻辑相关,您可以对其进行排查或搜索相关报错信息自行解决。
说明如果出现OOM异常,则需要检查业务逻辑是否有大内存占用,特别是某个字段特别大的情况。如果确实需要更大内存,您可以使用更大规格的Executor或Driver节点。
Spark应用无异常但运行速度变慢,您可以通过如下三种方法排查:
查看资源是否充足。
查看方法:
在Spark Jar开发页面,单击目标Spark应用操作列的UI,跳转到对应的Spark UI页面,在Stages页签下,查看执行速度较慢的Stage,并查看该Stage的并发度(表中字段为:Tasks: Succeeded/Total)。如果Tasks的总数大于
Executor个数*Executor核数
的值,则存在资源不足。例如:某个Tasks的总数是100,spark.executor.instances=5,spark.executor.resourceSpec=medium(2核8 GB),那么每次只能运行10个Tasks,需要运行10次。
解决方法:
您需要增加Spark应用的资源总量,调大Executor节点的个数(spark.executor.instances),或调大Executor规格(spark.executor.resourceSpec)。建议
Executor个数*Executor核数
的值不超过同时运行Tasks的总数,否则会导致资源浪费。查看GC Time时间是否过长。
查看方法:
在Spark Jar开发页面,单击目标Spark应用操作列的UI,跳转到对应的Spark UI页面,在Executors页签下,查看Executors列表中Task Time (GC Time)字段信息。
解决方法:
如果某些Executor节点的GC Time时间较长时,可以选择以下两种方案解决:
优化Spark应用的业务逻辑。
增大Executor(spark.executor.resourceSpec)或Driver(spark.driver.resourceSpec)的节点规格。
查看Driver或Executor堆栈信息。
查看方法:
在Spark Jar开发页面,单击目标Spark应用操作列的UI,跳转到对应的Spark UI页面,在Executors页签下,查看Thread Dump字段。
重要堆栈信息仅在Status字段为running时才能查看。
解决方法:
多次刷新堆栈查看Spark应用运行中的问题:
如果无法成功调用某些函数,则表示应用中函数逻辑的设计可能引入了热点问题,或函数实现效率较低,建议您优化该部分的业务逻辑。
如果无法调用某些Spark,建议通过搜索报错信息来解决。
如何定期删除Spark应用日志信息?
查看Spark应用日志信息的保存路径。
在Spark UI页面,单击Environment页签。
说明进入Spark UI的具体方法,请参见Spark开发编辑器。
在Environment页签下,单击Spark Properties,查看
spark.app.log.rootPath
参数对应的Value,该Value即目标Spark应用日志信息的保存路径。
设置日志信息的生命周期,自动删除过期日志。具体操作,请参见基于最后一次修改时间的生命周期规则。
如何解决创建UDF时,Spark应用卡住的问题?
原因:Spark社区版本从OSS下载文件时的已知Bug。
解决方法:在Spark应用中需要添加以下配置参数。参数说明,请参见Spark应用配置参数说明。
SET spark.kubernetes.driverEnv.ADB_SPARK_DOWNLOAD_FILES=oss://testBucketname/udf.jar;
SET spark.executorEnv.ADB_SPARK_DOWNLOAD_FILES=oss://testBucketname/udf.jar;
SET spark.driver.extraClassPath=/tmp/testBucketname/udf.jar;
SET spark.executor.extraClassPath=/tmp/testBucketname/udf.jar;