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 | ||
JDBC_COMMUNICATION_FAILURE | ||
JDBC_SSL_ERROR | ||
JDBC_COLUMN_TYPE_PARSER_ERROR | ||
业务需要处理的数据量突然变大导致Spark作业无法成功执行。 | EXECUTOR_CONTAINER_OOM | |
EXECUTOR_DISK_FULL | ||
Spark作业执行时立即失败。 | ENI_NOT_VALID | The VPC of the specified ENI and security group are not in the same VPC |
DRIVER_FILE_NOTFOUND | ||
Spark执行时偶发失败。 | BROADCAST_TOO_LARGE | |
BROADCAST_MEM_NOT_ENOUGH | ||
ADB_DOMAIN_NOT_RESOLVED | ||
配置弹性网卡的Spark作业失败。 | SG_MANADED_BY_CLOUD | The security group has been managed by another cloud product. |
VSWITCH_IP_NOT_ENOUGH | ||
Spark作业处于提交中状态,无法进入运行中状态。 | EXCEEDED_QUOTA | |
Spark SQL读写Hudi数据失败。 | HUDI_PARTITION_NOT_EXISTS | |
Spark作业访问OSS数据源失败。 | DRIVER_OSS_ACCESS_DENIED | |
Spark访问ElasticSearch数据源失败。 | ES_DATANODE_NOT_FOUND | EsHadoopNoNodesLeftException: Connection error .* all nodes failed |
Spark作业访问元数据失败。 | USER_HAVE_NONE_PRIVILEGE |
报错原因及解决方法
您可以在应用列表页签中,搜索应用ID,单击日志,查看目标Spark作业的日志信息。具体操作,请参见Spark开发编辑器。
Both '$jdbcTableName' and '$jdbcQueryString' can not be specified at the same time
报错出现日志:Driver日志。
报错原因:通过Spark访问JDBC数据源时,OPTIONS
配置项中的url
和dbtable
参数重复指定了数据表。
解决方法:数据表仅需指定一次,请删除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用户与数据库账号和授权数据库账号。