本文为您介绍使用Spark过程中的常见问题。
如何自检项目工程?
- 检查pom.xml。
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_${scala.binary.version}</artifactId> <version>${spark.version}</version> <scope>provided</scope> // spark-xxxx_${scala.binary.version} 依赖scope必须是provided。 </dependency>
- 检查主类spark.master。
val spark = SparkSession .builder() .appName("SparkPi") .config("spark.master", "local[4]") // 如果是以yarn-cluster方式提交,代码中如果有local[N]的配置,将会报错。 .getOrCreate()
- 检查主类Scala代码。
object SparkPi { // 必须是object,如果在IDEA创建文件的时候写为class,main函数是无法加载的。 def main(args: Array[String]) { val spark = SparkSession .builder() .appName("SparkPi") .getOrCreate()
- 检查主类代码配置。
val spark = SparkSession .builder() .appName("SparkPi") .config("key1", "value1") .config("key2", "value2") .config("key3", "value3") ... // 如果执行local测试时,将MaxCompute配置在hard-code代码里,部分配置是无法生效的。 .getOrCreate()
说明 建议您在使用yarn-cluster方式提交任务时,将配置项都写在spark-defaults.conf中。
在DataWorks上运行ODPS Spark节点的步骤是什么?
- 在本地Python环境中编辑Spark代码并打包。本地Python环境版本要求为Python 2.7。
- 上传资源包至DataWorks。详情请参见创建MaxCompute资源。
- 在DataWorks上创建ODPS Spark节点。详情请参见创建ODPS Spark节点。
- 编写代码并运行节点,在DataWorks控制台上即可查看运行结果。
MaxCompute Spark如何在本地进行调试?
您可以通过IntelliJ IDEA在本地进行调试。详情请参见搭建开发环境。
如何通过Spark访问VPC环境内的服务?
更多通过Spark访问VPC环境内的服务信息,请参见Spark访问VPC实例。
如何把JAR包当成资源来引用?
spark.hadoop.odps.cupid.resources
指定需要引用的资源。资源可以多个项目共享,建议您设置相关权限确保数据安全。示例如下。spark.hadoop.odps.cupid.resources = projectname.xx0.jar,projectname.xx1.jar
如何通过Spark传入参数?
传参详情请参见Spark on Dataworks。
如何将Spark流式读取的DataHub数据写入MaxCompute?
示例代码请参见DataHub。
如何将开源Spark代码迁移至MaxCompute Spark?
- 作业无需访问MaxCompute表和OSS。
您可以直接运行已有JAR包,详情请参见搭建开发环境。对于Spark或Hadoop的依赖必须设置为provided。
- 作业需要访问MaxCompute表。
配置相关依赖后重新打包即可,详情请参见搭建开发环境。
- 访问OSS所需要的包,打通网络请参见Spark访问VPC实例。
配置相关依赖后重新打包即可,详情请参见搭建开发环境。
如何通过Spark处理MaxCompute中的表数据?
MaxCompute Spark支持Local、Cluster和DataWorks运行模式。三种模式的配置不同,详情请参见运行模式。
运行Spark作业时,报错User signature dose not match,如何解决?
- 问题现象
运行Spark作业时,返回报错如下。
Stack: com.aliyun.odps.OdpsException: ODPS-0410042: Invalid signature value - User signature dose not match
- 产生原因
身份验证未通过,AccessKey ID或AccessKey Secret有误。
- 解决措施
请检查spark-defaults.conf提供的AccessKey ID、AccessKey Secret和阿里云官网控制台用户信息管理中的AccessKey ID、AccessKey Secret是否一致,如果不一致,请修改一致。
运行Spark作业时,报错You have NO privilege,如何解决?
- 问题现象
运行Spark作业时,返回报错如下。
Stack: com.aliyun.odps.OdpsException: ODPS-0420095: Access Denied - Authorization Failed [4019], You have NO privilege 'odps:CreateResource' on {acs:odps:*:projects/*}
- 产生原因
权限不足,需要申请权限。
- 解决措施
需要由项目所有者授予Resource的Read和Create权限。更多授权信息,请参见授权。
运行Spark作业时,报错Access Denied,如何解决?
- 问题现象
运行Spark作业时,返回报错如下。
Exception in thread "main" org.apache.hadoop.yarn.exceptions.YarnException: com.aliyun.odps.OdpsException: ODPS-0420095: Access Denied - The task is not in release range: CUPID
- 产生原因
- 原因一:Spark-defaults.conf中配置的AccessKey ID、AccessKey Secret不正确。
- 原因二:项目所在的地域未提供MaxCompute Spark服务。
- 解决措施
- 原因一的解决措施:检查Spark-defaults.conf配置信息,修改为正确的AccessKey ID、AccessKey Secret。更多信息,请参见搭建开发环境。
- 原因二的解决措施:确认项目所在的地域是否已经提供了MaxCompute Spark服务或加入钉钉群21969532(MaxCompute Spark支持群)咨询。
运行Spark作业时,报错No space left on device,如何解决?
Spark使用网盘进行本地存储。Shuffle数据和BlockManager溢出的数据均存储在网盘上。网盘的大小通过spark.hadoop.odps.cupid.disk.driver.device_size参数控制,默认为20 GB,最大为100 GB。如果调整到100 GB仍然报此错误,需要分析具体原因。常见原因为数据倾斜,在Shuffle或者Cache过程中数据集中分布在某些Block。此时可以缩小单个Executor的核数(spark.executor.cores),增加Executor的数量(spark.executor.instances)。
运行Spark作业时,报错Table or view not found,如何解决?
- 问题现象
运行Spark作业时,返回报错如下。
Table or view not found:xxx
- 产生原因
- 原因一:表或视图不存在。
- 原因二:打开了Hive的catalog配置。
- 解决措施
- 原因一的解决措施:请创建表。
- 原因二的解决措施:去掉catalog配置。报错示例如下,需要去掉
enableHiveSupport()
。spark = SparkSession.builder.appName(app_name).enableHiveSupport().getOrCreate()
运行Spark作业时,报错Shutdown hook called before final status was reported,如何解决?
- 问题现象
运行Spark作业时,返回报错如下。
App Status: SUCCEEDED, diagnostics: Shutdown hook called before final status was reported.
- 产生原因
提交到集群的user main并没有通过AM(ApplicationMaster)申请集群资源。例如,用户没有新建SparkContext或用户在代码中设置spark.master为local。
运行Spark作业时,发生JAR包版本冲突类错误,如何解决?
- 问题现象
运行Spark作业时,返回报错如下。
User class threw exception: java.lang.NoSuchMethodError
- 产生原因
JAR包版本冲突或类错误。
- 解决措施
- 在$SPARK_HOME/jars路径下找出异常类所在的JAR。
- 执行如下命令定位第三方库的坐标以及版本。
grep <异常类类名> $SPARK_HOME/jars/*.jar
- 在Spark作业根目录下,执行如下命令查看整个工程的所有依赖。
mvn dependency:tree
- 找到对应的依赖后,执行如下命令排除冲突包。
maven dependency exclusions
- 重新编译并提交代码。
运行Spark作业时,报错ClassNotFound,如何解决?
- 问题现象
运行Spark作业时,返回报错如下。
java.lang.ClassNotFoundException: xxxx.xxx.xxxxx
- 产生原因
类不存在或依赖配置错误。
- 解决措施
- 执行如下命令查看您提交的JAR包中是否存在该类定义。
jar -tf <作业JAR包> | grep <类名称>
- 检查pom.xml文件中的依赖是否正确。
- 使用Shade方式提交JAR包。
- 执行如下命令查看您提交的JAR包中是否存在该类定义。
运行Spark作业时,报错The task is not in release range,如何解决?
- 问题现象
运行Spark作业时,返回报错如下。
The task is not in release range: CUPID
- 产生原因
项目所在地域未开通MaxCompute Spark服务。
- 解决措施
请您提工单,开启该地域的MaxCompute Spark服务。
运行Spark作业时,报错java.io.UTFDataFormatException,如何解决?
- 问题现象
运行Spark作业时,返回报错如下。
java.io.UTFDataFormatException: encoded string too long: 2818545 bytes
- 解决措施
调整spark-defaults.conf中spark.hadoop.odps.cupid.disk.driver.device_size参数的值。默认为20 GB,最大支持100 GB。
运行Spark作业时,打印的中文乱码,如何解决?
"--conf" "spark.executor.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
"--conf" "spark.driver.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
Spark调用外网第三方任务时报错,如何解决?
Spark不能调用外网第三方任务,网络不通。
您可以在VPC中搭建Nginx反向代理,通过代理访问外网。Spark支持直接访问VPC,详情请参见Spark访问VPC实例。