本文汇总了使用AnalyticDB for MySQL Spark的常见问题及解决方案。

常见问题概览

如何查看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应用读JSON外表(包含日志投递自建)时,出现ClassNotFoundException: org.apache.hadoop.hive.serde2.JsonSerDe报错?

如何解决Spark SQL应用读内表时,出现No such file or directory报错?

运行Spark应用时,为什么Spark Executor节点会出现Dead?

Spark访问外部数据源时,为什么会出现网络连接失败问题?

Spark SQL应用使用SHOW TABLES或SHOW DATABASE命令查询库表时,为什么显示的库表与实际库表不符?

Spark应用为什么提示错误日志oss object 403?

如何定位Spark应用运行速度变慢的原因?

如何定期删除Spark应用日志信息?

如何解决创建UDF时,Spark应用卡住的问题?

如何查看Spark应用信息?

您可在Spark Jar开发页面,搜索应用ID,查看Spark应用信息。具体操作,请参见Spark开发编辑器

如何解决提交Spark应用时,出现User %s do not have right permission [ *** ] to resource [ *** ]报错?

原因:当前RAM用户没有调用该接口的权限。

解决方法:按以下步骤为RAM用户添加对应的权限。

  1. 登录RAM控制台,为该RAM用户授予报错信息中对应的Resource权限。

  2. 为RAM用户授予AliyunADBFullAccess、AliyunADBSparkProcessingDataRole和AnalyticDB for MySQL库表的读写权限。具体操作,请参见账号授权

如何解决运行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.jarhive-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节点对应的stderrstdout日志,查看具体报错原因。

    解决方法:

    • 优化Spark应用,避免大内存占用。

    • 调大Executor资源规格(spark.executor.resourceSpec)。

  • 原因3:

    集群开启了动态资源分配(spark.dynamicAllocation.enabled),状态为Dead的Executor节点日志中包含Driver commend a shutdown错误信息

    解决方法:

    该报错不会影响业务的正常运行,您无需处理。

除上述原因外,如果还有其他报错,您可查看状态为Dead的Executor节点日志。如果报错位置在业务代码中,您需要提交工单联系技术支持解决;其他错误信息,您可以搜索相关报错信息自行解决。

Spark访问外部数据源时,为什么会出现网络连接失败问题?

原因:通过VPC访问外部数据源时未开启ENI。

解决方法:您需在提交的Spark应用中设置spark.adb.eni.enabledspark.adb.eni.vswitchIdspark.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字段信息。

    解决方法:

    请参见运行Spark应用时,为什么Spark Executor节点会出现Dead?

  • 查看Driver日志,是否有异常信息导致Task终止并重试。

    查看方法:

    Spark Jar开发页面,单击目标Spark应用操作列的UI跳转到对应的Spark UI页面,在Executors页签下,查看Executor IDdriverstderr日志。

    解决方法:

    通过日志中的报错信息查看异常的具体原因,大部分异常原因跟业务逻辑相关,您可以对其进行排查或搜索相关报错信息自行解决。

    说明

    如果出现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应用日志信息?

  1. 查看Spark应用日志信息的保存路径。

    1. Spark UI页面,单击Environment页签

      说明

      进入Spark UI的具体方法,请参见Spark开发编辑器

    2. Environment页签下,单击Spark Properties,查看spark.app.log.rootPath参数对应的Value,该Value即目标Spark应用日志信息的保存路径。

  2. 设置日志信息的生命周期,自动删除过期日志。具体操作,请参见基于最后一次修改时间的生命周期规则

如何解决创建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;