Spark常见报错

更新时间:

本文汇总了AnalyticDB for MySQL Spark作业常见的错误码、报错信息、报错原因和解决办法。您可以参考本文解决报错。

报错概览

现象

错误码

报错信息

Spark访问JDBC数据源失败。

JDBC_SOURCE_TABLE_NAME_DUPLICATE

Both '$jdbcTableName' and '$jdbcQueryString' can not be specified at the same time

JDBC_NO_SUITABLE_DRIVER

SQLException .* No suitable driver found for

JDBC_COMMUNICATION_FAILURE

CommunicationsException .* Communications link failure

JDBC_SSL_ERROR

SSL peer shut down incorrectly

JDBC_COLUMN_TYPE_PARSER_ERROR

Can't get JDBC type for <数据类型>

业务需要处理的数据量突然变大导致Spark作业无法成功执行。

EXECUTOR_CONTAINER_OOM

Exit Code: 137

EXECUTOR_DISK_FULL

No space left on device

Spark作业执行时立即失败。

ENI_NOT_VALID

The VPC of the specified ENI and security group are not in the same VPC

DRIVER_FILE_NOTFOUND

java.lang.ClassNotFoundException

Spark执行时偶发失败。

BROADCAST_TOO_LARGE

Cannot broadcast the table that is larger than

BROADCAST_MEM_NOT_ENOUGH

Not enough memory to build and broadcast the table to all

ADB_DOMAIN_NOT_RESOLVED

unkown host .* ts.adb.com

配置弹性网卡的Spark作业失败。

SG_MANADED_BY_CLOUD

The security group has been managed by another cloud product.

VSWITCH_IP_NOT_ENOUGH

does not have enough IP addresses

Spark作业处于提交中状态,无法进入运行中状态。

EXCEEDED_QUOTA

exceeded quota

Spark SQL读写Hudi数据失败。

HUDI_PARTITION_NOT_EXISTS

Error fetching partition paths with prefix

Spark作业访问OSS数据源失败。

DRIVER_OSS_ACCESS_DENIED

The bucket you access does not belong to you

Spark访问ElasticSearch数据源失败。

ES_DATANODE_NOT_FOUND

EsHadoopNoNodesLeftException: Connection error .* all nodes failed

Spark作业访问元数据失败。

USER_HAVE_NONE_PRIVILEGE

MetaException .* User have none of the privileges

报错原因及解决方法

说明

您可以在应用列表页签中,搜索应用ID,单击日志,查看目标Spark作业的日志信息。具体操作,请参见Spark开发编辑器

Both '$jdbcTableName' and '$jdbcQueryString' can not be specified at the same time

报错出现日志:Driver日志。

报错原因:通过Spark访问JDBC数据源时,OPTIONS配置项中的urldbtable参数重复指定了数据表。

解决方法:数据表仅需指定一次,请删除url参数中指定的表名。

SQLException .* No suitable driver found for

报错出现日志:Driver日志。

报错原因:通过Spark访问JDBC数据源时,没有找到合适的驱动。

解决方法:检查作业配置的JAR包,需确保JAR包中有合适的JDBC驱动程序。同时访问多种JDBC数据源时,JAR包中需有所有数据源相关的JDBC驱动程序。例如:同时访问Hive和RDS MySQL数据源,JAR包中应包含Hive数据源和RDS MySQL数据源的JDBC驱动。

CommunicationsException .* Communications link failure

报错出现日志:Driver日志。

报错原因:Spark作业中配置的弹性网卡无法访问指定的数据源。常见于访问RDS MySQL数据源和HDFS数据源的场景。

解决方法

  • 检查当前Spark作业中指定交换机的IP地址段是否在数据源的白名单配置中。若不在,则需配置数据源的白名单。

    例如:访问RDS数据源时,若指定交换机的IP地址段不在RDS的白名单中,则需将指定的交换机IP地址段添加到RDS的白名单。

  • 检查当前Spark作业中指定的安全组是否开放了目标数据源的端口访问权限。具体操作,请参见添加安全组规则

    例如:访问RDS MySQL数据源时,应在安全组规则的入方向与出方向开放3306端口。

  • 检查当前Spark作业中挂载的弹性网卡是否和目标数据源在同一个VPC中。

SSL peer shut down incorrectly

报错出现日志:Driver日志。

报错原因:通过Spark访问JDBC数据源时没有配置正确的SSL证书。

解决方法:请参考通过SSL链路访问RDS MySQL数据文档中的配置示例,配置正确的SSL证书信息。

Can't get JDBC type for <数据类型>

报错出现日志:Driver日志。

报错原因:Spark访问JDBC数据源时数据类型转换错误。例如:访问RDS MySQL数据时,数据源中的数据类型为允许为空的SHORT INT, 映射到AnalyticDB for MySQL表中的类型是INT

解决方法:修改AnalyticDB for MySQL中表的数据类型,确保JDBC数据源中允许为空的数据列类型也可以被正确的映射到AnalyticDB for MySQL。 例如:RDS MySQL的数据类型为SHORT INT ,映射到AnalyticDB for MySQL表为BOOLEAN

Exit Code: 137

报错出现日志:Driver日志。

报错原因Executor进程使用的内存超出限制。Spark Executor除了JVM本身使用的内存外,还包括堆外内存(Shuffle、Cache),以及Python UDF等使用的内存。容器使用的内存超过了容器允许使用内存的限制,导致Spark进程被kill命令强制终止。常见于数据挖掘场景或者以Python语言为核心的Spark作业中。

解决方法:调大spark.executor.memoryOverhead参数,该参数表示容器内部非Spark Executor进程可使用的内存容量(单位MB),默认为Executor容器总内存容量的百分之三十。例如您当前配置的Executor规格是Medium(2核8 GB),则容器内部非Spark Executor进程可使用的内存容量默认为是2.4 GB。调整语句如下:

spark.executor.memoryOverhead: 4000MB

No space left on device

报错出现日志:Executor日志。

报错原因:磁盘空间不足。

解决方法:通过spark.adb.executorDiskSize参数挂载的额外磁盘。具体操作,请参见Spark应用配置参数说明

The VPC of the specified ENI and security group are not in the same VPC

报错出现日志:Driver日志。

报错原因:Spark作业配置的交换机和安全组不在同一VPC内。

解决方法:检查Spark作业中的配置,并重新配置正确的交换机和安全组。

java.lang.ClassNotFoundException

报错出现日志:Driver日志。

报错原因:提交Spark作业时,上传的JAR包缺少类,常见于使用第三方JAR包的场景。

解决方法:检查第三方JAR包是否完整,若不完整,需要重新打包,并确保JAR包中含目标类。

Cannot broadcast the table that is larger than

报错出现日志:Driver日志。

报错原因:广播表的大小超过了配置的限制,导致广播失败。广播表的详情,请参见Broadcast

解决方法

  • Spark作业中广播表的最大内存为8 GB,您可以在提交Spark作业时使用spark.sql.autoBroadcastJoinThreshold参数配置广播表的内存。单位MB。

  • Spark会使用抽样方法估算表的大小,如果表分布不均匀,估算就会出现错误。您可以将spark.sql.autoBroadcastJoinThreshold参数的取值配置为-1,关闭广播特性,从而保障业务可以顺利执行。单位MB。

Not enough memory to build and broadcast the table to all

报错出现日志:Driver日志。

报错原因:广播表超过了Driver节点的最大内存。广播表的详情,请参见Broadcast

解决方法:您需调小spark.sql.autoBroadcastJoinThreshold参数的取值,建议不超过400。单位MB。

unkown host .* ts.adb.com

报错出现日志:Driver日志。

报错原因:由于网络波动,DNS服务器连接失败等原因导致内部服务域名解析失败。

解决方法:若该报错发生频率较高,可以配置spark.adb.eni.adbHostAlias.enabled=true解决。

The security group has been managed by another cloud product.

报错出现日志:GetSparkAppLog返回日志。

报错原因:Spark作业中指定的安全组为另外一个云服务管理的安全组,不允许在AnalyticDB for MySQL Spark中使用。

解决方法:检查Spark作业中安全组的配置,并重新配置正确的安全组。

does not have enough IP addresses

报错出现日志:GetSparkAppLog返回日志。

报错原因:Spark作业中指定的交换机配额已满,无法申请更多的IP地址。

解决方法:检查Spark作业中交换机的配置,并重新配置交换机,确保其有足够的空闲IP。

exceeded quota

报错出现日志:GetSparkAppLog接口返回日志。

报错原因:Spark作业执行所需资源超过了Job型资源组剩余的可用资源。

解决方法:修改资源组的计算最大预留资源,或等待其他作业执行完成后再提交Spark作业。

Error fetching partition paths with prefix

报错出现日志:Driver日志。

报错原因:通过Spark访问Hudi数据时,所指定的Hudi表分区不存在。

解决方法:检查Hudi表分区是否存在。

The bucket you access does not belong to you

报错出现日志:Driver日志。

报错原因spark.adb.roleArn参数指定的角色没有访问OSS的权限。

解决方法您需为RAM用户授予对应权限。具体操作,请参见同账号授权

EsHadoopNoNodesLeftException: Connection error .* all nodes failed

报错出现日志:Driver日志。

报错原因:检索分析服务Elasticsearch版不允许Spark直连DataNode访问数据,导致开源社区的默认配置无法访问数据。

解决方法:请参考访问Elasticsearch数据源文档中的配置示例,访问ElasticSearch数据。

MetaException .* User have none of the privileges

报错出现日志:Driver日志。

报错原因:执行Spark作业的用户没有访问元数据的权限。

解决方法您需要为执行Spark作业的数据库账号绑定RAM用户并根据读写需求授予对应的库表权限。具体操作,请参见绑定或解绑RAM用户与数据库账号授权数据库账号