本文为您介绍使用Spark过程中可能遇到的常见问题。

如何进行项目工程自检?

建议您检查如下4项:
  • 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>
  • 主类代码hard-code spark.master
    val spark = SparkSession
          .builder()
          .appName("SparkPi")
          .config("spark.master", "local[4]") // 如果是yarn-cluster方式提交,代码中如果还有local[N]的配置,将会报错。
          .getOrCreate()
  • 主类scala代码必须是object不是class。
    object SparkPi { // 必须是object,如果在IDEA创建文件的时候写成class,main函数是无法加载的。
      def main(args: Array[String]) {
        val spark = SparkSession
          .builder()
          .appName("SparkPi")
          .getOrCreate()
  • 主类hard-code配置。
    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中。

如何将开源Spark代码迁移到Spark on MaxCompute上?

分以下3种情形:
  • 作业无需访问MaxCompute表和OSS。

    您的Jar包可直接运行,具体步骤请参见搭建开发环境。对于Spark或Hadoop的依赖必须设置为provided

  • 作业需要访问MaxCompute表。

    配置相关依赖后重新打包即可。配置依赖的步骤请参见配置依赖

  • 作业需要访问OSS。

    配置相关依赖后重新打包即可。配置依赖的步骤请参见配置依赖

如何通过Spark访问VPC环境内服务?

详情请参见Spark访问VPC实例

spark-defaults.conf提供的ID、Key错误,如何处理?

Stack:
com.aliyun.odps.OdpsException: ODPS-0410042:
Invalid signature value - User signature dose not match

请检查spark-defaults.conf提供的ID、Key和阿里云官网控制台用户信息管理中的AccessKey IDAccess Key Secret是否一致。

提示权限不足,如何处理?

Stack:
com.aliyun.odps.OdpsException: ODPS-0420095: 
Access Denied - Authorization Failed [4019], You have NO privilege 'odps:CreateResource' on {acs:odps:*:projects/*}

请项目空间所有者授权Grant Resource的Read以及Create权限。

运行提示项目未支持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

首先需要确认项目所在的Region中,是否已经提供了MaxCompute Spark服务。同时,检查Spark-defaults.conf配置信息是否与产品文档中的要求一致。如果Region已经支持,请通过工单或加入钉钉群:21969532(MaxCompute Spark支持群)进行咨询。

运行时报错No space left on device,如何处理?

Spark使用网盘进行本地存储。Shuffle数据和BlockManager溢出的数据均存储在网盘上。网盘的大小通过参数spark.hadoop.odps.cupid.disk.driver.device_size控制,默认20GB,最大100GB。如果调整到100GB仍然报出此错误,则需要分析具体原因。常见的原因为数据倾斜,在Shuffle或者Cache过程中数据集中分布在某些Block。此时可以缩小单个Executor的并发(spark.executor.cores),增加Executor的数量(spark.executor.instances)。

如何把Jar包当成资源来引用?

通过参数spark.hadoop.odps.cupid.resources指定需要引用的资源。资源可以多个项目共享,建议您设置好权限确保数据安全。示例如下。
spark.hadoop.odps.cupid.resources = projectname.xx0.jar,projectname.xx1.jar 

运行时报错找不到表或视图,如何处理?

  • 问题现象:报错信息如下。
    Table or view not found:xxx
  • 解决办法:请检查报错的表在项目空间中是否存在。
    • 如果不存在,请创建表。
    • 如果存在,请检查是否打开了Hive的catalog配置。如果是打开的,请去掉此配置。例如,常见的导致报错的写法如下,需要将中间的enableHiveSupport()去掉。
      spark = SparkSession.builder.appName(app_name).enableHiveSupport().getOrCreate()

运行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实例

运行时报错Shutdown hook called before final status was reported,是什么原因?

  • 问题现象:提交作业后报错如下。
    App Status: SUCCEEDED, diagnostics: Shutdown hook called before final status was reported.
  • 问题原因:由于提交到集群的user main并没有通过AM(ApplicationMaster)申请集群资源,直接退出了。例如,用户没有新建SparkContext、用户在代码里面设置spark.master为local。

运行时发生Jar包版本冲突类错误,如何处理?

  • 问题现象:运行时报错如下。
    User class threw exception: java.lang.NoSuchMethodError
  • 解决方法:
    1. $SPARK_HOME/jars路径下面找出异常类所在的Jar。
    2. 执行如下命令定位第三方库的坐标以及版本。
      grep <异常类类名> $SPARK_HOME/jars/*.jar
    3. 在Spark作业工程根目录下,执行如下命令查看整个工程的所有依赖。
      mvn dependency:tree
    4. 找到对应的依赖后,执行如下命令将引入的冲突包排除。
      maven dependency exclusions
    5. 重新编译代码并提交。

运行时发生ClassNotFound类错误,如何处理?

  • 问题现象:运行时报错如下。
    java.lang.ClassNotFoundException: xxxx.xxx.xxxxx
  • 解决方法:
    1. 执行如下命令查看您提交的Jar包里是否存在该类定义。
      jar -tf <作业jar包> | grep <类名称>
    2. 检查pom.xml文件中的依赖是否正确。
    3. 使用shade包提交Jar包。

运行时报错No space left on device,如何处理?

  • 问题现象:运行时报错如下。
    No space left on device.
  • 解决方法:Spark使用网盘作为本地存储,Shuffle数据以及BlockManager溢出的数据均存储在网盘上。网盘的大小通过参数spark.hadoop.odps.cupid.disk.driver.device_size控制,默认20GB,最大100GB。
    如果调整到100GB仍然会出现此错误,需要分析具体原因,常见原因如下:
    • 数据倾斜,在shuffle或者cache过程中数据集中分布在某些Block。
    • 可以缩小单个执行器的并发(spark.executor.cores),增加执行器的数量(spark.executor.instances)。

运行时报错The task is not in release range,如何处理?

  • 问题现象:运行时报错如下。
    The task is not in release range: CUPID
  • 解决方法:提交工单开启该Region中的MaxCompute Spark支持。

运行时报错You have NO privilege,如何处理?

  • 问题现象:运行时报错如下。
    Tcom.aliyun.odps.OdpsException: ODPS-0420095: 
    Access Denied - Authorization Failed [4019], You have NO privilege 'odps:CreateResource' on {acs:odps:*:projects/*}
  • 解决方法:用来提交Spark作业的云账号或者子账号没有对应权权限,详情请参见授权

运行时报错User signature dose not match,如何处理?

  • 问题现象:运行时报错如下。
    Invalid signature value - User signature dose not match
  • 解决方法:通常是spark-defaults.conf里的spark.hadoop.odps.access.idspark.hadoop.odps.access.key填写有误导致的。请确认AccessKey ID和AccessKey Secret信息。