常见问题

本文汇总了使用EMR Serverless Spark时的常见问题。

DLF适配问题

读取数据时报错“java.net.UnknownHostException”,该如何处理?

  • 问题现象

    数据开发中执行SQL查询从DLF 1.0的数据表中读取信息时,遇到了 UnknownHostException异常。

    image

  • 问题原因

    通常是因为系统找不到指定的主机,导致无法成功查询数据表。

  • 解决方案

    根据HDFS集群是否配置了高可用(HA)模式,需要采取不同的配置策略。

    • 未配置HAHDFS路径访问

      当表的location指向一个未启用高可用配置的HDFS路径时,仅需确保location中的域名可被访问。默认情况下master-1-1.<cluster-id>.<region>.emr.aliyuncs.com可以直接访问,而其他域名则需参考管理域名以添加映射关系。

    • 配置HAHDFS路径访问

      如果表的location指向的是一个启用了高可用性的HDFS路径,在配置好域名映射关系的基础上,需要在管理自定义配置文件中新建一个名为hdfs-site.xml的配置文件,并将其保存于路径/etc/spark/conf中,以确保Java RuntimeFusion Runtime能够正常访问数据。文件示例如下所示,完整内容应以EMR on ECS集群中的hdfs-site.xml为准。

      <?xml version="1.0"?>
      <configuration>
        <property>
          <name>dfs.nameservices</name>
          <value>hdfs-cluster</value>
        </property>
        <property>
          <name>dfs.ha.namenodes.hdfs-cluster</name>
          <value>nn1,nn2,nn3</value>
        </property>
        <property>
          <name>dfs.namenode.rpc-address.hdfs-cluster.nn1</name>
          <value>master-1-1.<cluster-id>.<region-id>.emr.aliyuncs.com:<port></value>
        </property>
        <property>
          <name>dfs.namenode.rpc-address.hdfs-cluster.nn2</name>
          <value>master-1-2.<cluster-id>.<region-id>.emr.aliyuncs.com:<port></value>
        </property>
        <property>
          <name>dfs.namenode.rpc-address.hdfs-cluster.nn3</name>
          <value>master-1-3.<cluster-id>.<region-id>.emr.aliyuncs.com:<port></value>
        </property>
        <property>
          <name>dfs.client.failover.proxy.provider.hdfs-cluster</name>
          <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
      </configuration>
    • (可选):配置开启KerberosHDFS路径访问

      如果作业需要访问开启KerberosHDFS路径,需添加spark配置spark.kerberos.access.hadoopFileSystems,具体内容以HDFS集群中的fs.defaultFS配置为准,例如HAEMR on ECS集群默认为hdfs://hdfs-cluster

OSS适配问题

如何账号访问阿里云OSS?

在使用EMR Serverless Spark执行Spark任务时,如果您需要访问不同阿里云账户下的OSS资源,可以采用两种方式。一种是在工作空间级别,赋予工作空间的执行角色对目标OSS的读写权限;另一种是在任务或会话级别,通过在Spark配置中增加配置进行设置。

  • 工作空间级别

    您需要在目标OSSBucket Policy中配置相应的访问权限,以允许Serverless Spark工作空间的执行角色进行OSS的读写操作。以下是具体操作步骤:

    1. 进入阿里云OSSBucket 授权策略页面。

      1. 登录OSS管理控制台

      2. 单击Bucket 列表,然后单击目标Bucket名称。

      3. 在左侧导航栏,选择权限控制 > Bucket 授权策略

    2. Bucket 授权策略页面的按图形策略添加页签,单击新增授权

    3. 新增授权面板,配置以下参数,然后单击确定

      参数

      说明

      授权资源

      选择整个Bucket

      授权用户

      选择其他账号。Principal填写为arn:sts::<uid>:assumed-role/<role-name>/*。其中:

      • <uid>需要替换为阿里云账号ID(主账号ID)。

      • <role-name>需要替换为Serverless Spark工作空间的执行角色名称(请注意区分大小写)。您可以在EMR Serverless Spark的工作空间列表页面,单击目标工作空间操作列的详情,以查看执行角色,默认使用的角色是AliyunEMRSparkJobRunDefaultRole

      其余参数可以根据实际情况进行配置,更多参数介绍请参见图形化配置Bucket Policy

  • 任务、会话级别

    在创建任务和会话时,在Spark配置中添加下列配置,可以访问目标OSS。

    spark.hadoop.fs.oss.bucket.<bucketName>.endpoint <endpoint>
    spark.hadoop.fs.oss.bucket.<bucketName>.credentials.provider com.aliyun.jindodata.oss.auth.SimpleCredentialsProvider
    spark.hadoop.fs.oss.bucket.<bucketName>.accessKeyId <accessID>
    spark.hadoop.fs.oss.bucket.<bucketName>.accessKeySecret <accessKey>

    请根据您的实际情况替换以下信息。

    • <bucketName>:您要访问的OSS Bucket的名称。

    • <endpoint>:OSSEndpoint。

    • <accessID>:访问OSS数据所使用阿里云账号的AccessKey ID。

    • <accessKey>:访问OSS数据所使用阿里云账号的AccessKey Secret。

任务执行报错:OSS文件不存在或无权限访问

  • 问题现象

    在使用阿里云EMR Serverless Spark执行任务时,可能会遇到报错提示,主程序引用的OSS文件不存在或无权限访问。

    image

  • 问题原因

    • 执行角色权限不足 创建Serverless Spark工作空间时,指定的执行角色未正确配置,或者修改了默认的执行角色,导致无法访问OSS资源。

    • OSS文件路径错误 主程序中引用的OSS文件路径拼写错误或文件实际不存在。

    • 引用的文件名称中包含空格

      如果引用的OSS文件名称中包含空格,可能会导致解析失败。

  • 解决方案

    • 检查并正确配置执行角色

      查看当前执行角色:在Serverless Spark页面,单击目标工作空间操作列的详情,查看执行角色,确保为AliyunEMRSparkJobRunDefaultRole

      • 如果使用的是默认角色但仍然遇到问题,请进一步排查其他原因。

      • 如果使用的是使用自定义角色:

        • 请确保权限策略中包含了相应的内容,例如,是否具有对目标OSS资源的读取权限(oss:GetObject)。具体请参见AliyunEMRSparkJobRunDefaultRolePolicy进行权限设置。

        • 如果权限配置较复杂或不确定,建议重新创建工作空间,并确保指定的执行角色为默认的AliyunEMRSparkJobRunDefaultRole

          image

          说明

          建议您使用默认角色,而非自定义角色,以避免权限配置问题。

    • 验证OSS文件路径

      • 确认路确认OSS文件路径的正确性,包括路径前缀oss://、Bucket名称、目录路径和文件名。

      • 使用OSS控制台验证目标文件是否存在。

    • 处理文件名中的空格

      检查并重命名文件,确保文件名中不包含空格或其他特殊字符。

    如果通过以上排查问题仍未解决,可以联系阿里云技术支持。

S3适配问题

如何访问S3?

在创建任务和会话时,在Spark配置中添加下列配置,可以访问S3。

spark.hadoop.fs.s3.impl com.aliyun.jindodata.s3.JindoS3FileSystem
spark.hadoop.fs.AbstractFileSystem.s3.impl com.aliyun.jindodata.s3.S3
spark.hadoop.fs.s3.bucket.<bucketName>.accessKeyId <accessID>
spark.hadoop.fs.s3.bucket.<bucketName>.accessKeySecret <accessKey> 
spark.hadoop.fs.s3.bucket.<bucketName>.endpoint <endpoint>
spark.hadoop.fs.s3.credentials.provider com.aliyun.jindodata.s3.auth.SimpleCredentialsProvider

请根据您的实际情况替换以下信息。

  • <bucketName>:您要访问的S3 Bucket的名称。

  • <endpoint>:S3Endpoint。

  • <accessID>:访问S3数据所使用账号的AccessKey ID。

  • <accessKey>:访问S3数据所使用账号的AccessKey Secret。

OBS适配问题

如何访问OBS?

在创建任务和会话时,在Spark配置中添加下列配置,可以访问OBS。

spark.hadoop.fs.obs.impl com.aliyun.jindodata.obs.JindoObsFileSystem
spark.hadoop.fs.AbstractFileSystem.obs.impl com.aliyun.jindodata.obs.OBS
spark.hadoop.fs.obs.bucket.<bucketName>.accessKeyId <accessID>
spark.hadoop.fs.obs.bucket.<bucketName>.accessKeySecret <accessKey> 
spark.hadoop.fs.obs.bucket.<bucketName>.endpoint <endpoint>
spark.hadoop.fs.obs.credentials.provider com.aliyun.jindodata.obs.auth.SimpleCredentialsProvider

请根据您的实际情况替换以下信息。

  • <bucketName>:您要访问的OBS Bucket的名称。

  • <endpoint>:OBSEndpoint。

  • <accessID>:访问OBS数据所使用账号的AccessKey ID。

  • <accessKey>:访问OBS数据所使用账号的AccessKey Secret。