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

问题类别 常见问题
开发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节点的步骤是什么?

  1. 在本地Python环境中编辑Spark代码并打包。本地Python环境版本要求为Python 2.7。
  2. 上传资源包至DataWorks。详情请参见创建MaxCompute资源
  3. 在DataWorks上创建ODPS Spark节点。详情请参见创建ODPS Spark节点
  4. 编写代码并运行节点,在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 IDAccessKey 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包版本冲突或类错误。

  • 解决措施
    1. $SPARK_HOME/jars路径下找出异常类所在的JAR。
    2. 执行如下命令定位第三方库的坐标以及版本。
      grep <异常类类名> $SPARK_HOME/jars/*.jar
    3. 在Spark作业根目录下,执行如下命令查看整个工程的所有依赖。
      mvn dependency:tree
    4. 找到对应的依赖后,执行如下命令排除冲突包。
      maven dependency exclusions
    5. 重新编译并提交代码。

运行Spark作业时,报错ClassNotFound,如何解决?

  • 问题现象

    运行Spark作业时,返回报错如下。

    java.lang.ClassNotFoundException: xxxx.xxx.xxxxx
  • 产生原因

    类不存在或依赖配置错误。

  • 解决措施
    1. 执行如下命令查看您提交的JAR包中是否存在该类定义。
      jar -tf <作业JAR包> | grep <类名称>
    2. 检查pom.xml文件中的依赖是否正确。
    3. 使用Shade方式提交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.confspark.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实例