すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:Spark FAQ

最終更新日:Nov 09, 2025

このトピックでは、Spark の使用に関するよくある質問に回答します。

カテゴリ

FAQ

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} 依存関係のスコープは provided である必要があります。
    </dependency>
  • メインクラス spark.master を確認します。

    val spark = SparkSession
          .builder()
          .appName("SparkPi")
          .config("spark.master", "local[4]") // yarn-cluster モードでジョブを送信する場合、コードに local[N] 構成があるとエラーが発生します。
          .getOrCreate()
  • メインクラスの Scala コードを確認します。

    object SparkPi { // これは object である必要があります。IntelliJ 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")
          ...  // ローカルテストのためにコードに MaxCompute 構成をハードコーディングすると、一部の構成が有効にならない場合があります。
          .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 を使用してローカルでデバッグできます。詳細については、「Linux 開発環境のセットアップ」をご参照ください。

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 パッケージを直接実行できます。詳細については、「Linux 開発環境のセットアップ」をご参照ください。Spark または Hadoop の依存関係は provided に設定する必要があります。

  • ジョブは MaxCompute テーブルにアクセスする必要があります。

    関連する依存関係を構成してから、再パッケージ化します。詳細については、「Linux 開発環境のセットアップ」をご参照ください。

  • ジョブは OSS にアクセスする必要があります。

    OSS へのアクセスに必要なパッケージを取得し、ネットワーク接続を確立します。次に、アプリケーションを再コンパイルしてパッケージ化し、デプロイして実行します。詳細については、「Linux 開発環境のセットアップ」をご参照ください。

Spark を使用して MaxCompute のテーブルデータを処理するにはどうすればよいですか?

MaxCompute 上の Spark は、Local、Cluster、および DataWorks の実行モードをサポートしています。3 つのモードの構成は異なります。詳細については、「実行モード」をご参照ください。

Spark のリソース並列処理を設定するにはどうすればよいですか?

Spark のリソース並列処理は、エグゼキュータの数とエグゼキュータあたりの CPU コア数によって決まります。並列実行できるタスクの最大数は、エグゼキュータの数 × エグゼキュータあたりの CPU コア数 です。

  • エグゼキュータの数

    • パラメータ: spark.executor.instances

    • 説明: ジョブがリクエストするエグゼキュータの数を設定します。

  • エグゼキュータあたりの CPU コア数

    • パラメータ: spark.executor.cores

    • 説明: 各エグゼキュータプロセスの CPU コア数を設定します。このパラメーターは、各エグゼキュータプロセスがタスクを並列実行する能力を決定します。各 CPU コアは一度に 1 つのタスクしか実行できません。各エグゼキュータの CPU コア数は 2 から 4 の値に設定することをお勧めします。

メモリ不足の問題を解決するにはどうすればよいですか?

  • 一般的なエラー:

    • java.lang.OutOfMemoryError: Java heap space

    • java.lang.OutOfMemoryError: GC overhead limit exceeded

    • Cannot allocate memory

    • ジョブが "OOM Killer" によって強制終了されたため、ジョブのメモリ使用量を確認してください。

  • 解決策:

    • エグゼキュータのメモリを設定する。

      • パラメーター: spark.executor.memory

      • パラメーターの説明: このパラメーターは、各エグゼキュータのメモリサイズを指定します。spark.executor.cores に対するエグゼキュータメモリの比率を 1:4 に維持することをお勧めします。たとえば、spark.executor.cores1 に設定されている場合、spark.executor.memory4 GB に設定できます。エグゼキュータが java.lang.OutOfMemoryError 例外をスローした場合は、このパラメーターの値を増やす必要があります。

    • エグゼキュータのオフヒープメモリを設定する。

      • パラメーター: spark.executor.memoryOverhead

      • 説明: 各エグゼキュータの追加メモリを指定します。このメモリは主に、JVM 自体、文字列、NIO バッファーなどのオーバーヘッドに使用されます。デフォルトサイズは spark.executor.memory × 0.1 で、最小値は 384 MB です。通常、このパラメーターを設定する必要はありません。エグゼキュータログに Cannot allocate memory または OOM Killer エラーが表示された場合は、この値を増やすことができます。

    • ドライバーのメモリを設定する。

      • パラメーター: spark.driver.memory

      • パラメーターの説明: このパラメーターは、ドライバーのメモリサイズを指定します。spark.driver.cores とドライバーメモリの比率を 1:4 にすることをお勧めします。ドライバーが大量のデータを収集する必要がある場合、または java.lang.OutOfMemoryError エラーが報告された場合は、この値を増やす必要があります。

    • ドライバーのオフヒープメモリを設定する。

      • パラメーター: spark.driver.memoryOverhead

      • 説明: ドライバーの追加メモリを指定します。デフォルトサイズは spark.driver.memory × 0.1 で、最小値は 384 MB です。ドライバーログに Cannot allocate memory エラーが表示された場合は、この値を増やすことができます。

ディスク領域不足の問題を解決するにはどうすればよいですか?

  • 症状

    No space left on device エラーが発生します。

  • 原因: このエラーは、ローカルディスク領域が不足していることを示します。このエラーは通常、エグゼキュータで発生し、エグゼキュータが終了する原因となります。

  • 解決策:

    • ディスクサイズを増やします。

      • パラメーター: spark.hadoop.odps.cupid.disk.driver.device_size

      • デフォルト値: 20 GB。

      • 説明: デフォルトでは、ドライバーと各エグゼキュータに 20 GB のローカルディスク領域が提供されます。ディスク領域が不足している場合は、このパラメーター値を増やすことができます。このパラメーターは、spark-defaults.conf ファイルまたは DataWorks の設定項目で構成されている場合にのみ有効になることに注意してください。

    • エグゼキュータの数を増やします。

      ローカルディスクサイズを 100 GB に増やしてもこのエラーが解決しない場合、単一のエグゼキュータのシャッフルデータが上限を超えています。これはデータスキューが原因である可能性があります。この場合、データを再パーティション分割する必要があります。データ量が大きすぎるためにエラーが発生することもあります。この場合、spark.executor.instances パラメーターを調整してエグゼキュータの数を増やす必要があります。

MaxCompute プロジェクトのリソースを参照するにはどうすればよいですか?

MaxCompute 上の Spark は、MaxCompute のリソースにアクセスするために次の 2 つのメソッドをサポートしています。

  • パラメーターを構成して MaxCompute リソースを直接参照する。

    • パラメーター: spark.hadoop.odps.cupid.resources

    • フォーマット: <projectname>.<resourcename>[:<newresourcename>]

    • 説明: この設定項目は、タスクの実行に必要な MaxCompute リソースを指定します。詳細については、「リソース操作」をご参照ください。指定されたリソースは、ドライバーとエグゼキュータの現在の作業ディレクトリにダウンロードされます。タスクは複数のリソースを参照できます。リソースはカンマ (,) で区切ることができます。リソースが作業ディレクトリにダウンロードされると、そのデフォルト名は <projectname>.<resourcename> になります。<projectname>.<resourcename>:<newresourcename> のフォーマットを使用してリソースの名前を変更できます。この設定項目は、spark-defaults.conf ファイルまたは DataWorks の設定項目で構成されている場合にのみ有効になることに注意してください。

    • 例:

      ## 次の構成は、DataWorks の設定項目または spark-defaults.conf ファイルに追加する必要があります。
      
      ## 複数のリソースを同時に参照する: public.python-python-2.7-ucs4.zip と public.myjar.jar の両方を参照します。
      spark.hadoop.odps.cupid.resources=public.python-python-2.7-ucs4.zip,public.myjar.jar
      
      ## 名前の変更例: public.myjar.jar を参照し、myjar.jar に名前を変更します。
      spark.hadoop.odps.cupid.resources=public.myjar.jar:myjar.jar
  • DataWorks のリソースを参照する。

    • DataWorks の [データ開発] ペインで、MaxCompute からビジネスフローにリソースを追加します。詳細については、「MaxCompute リソースの管理」をご参照ください。

    • DataWorks の ODPS Spark ノードで、JAR、ファイル、およびアーカイブのリソースを選択します。

    説明

    このメソッドは、タスクの実行時にリソースをアップロードします。大きなリソースの場合は、メソッド 1 を使用してください。

VPC にアクセスするにはどうすればよいですか?

MaxCompute 上の Spark は、Alibaba Cloud VPC のサービスにアクセスするために次のメソッドをサポートしています。

  • ENI 接続経由のアクセス

    • 制限

      Elastic Network Interface (ENI) を使用して、同じリージョン内の VPC に接続できます。ジョブが複数の VPC にアクセスする必要がある場合は、ENI を介して既に接続されている VPC を他の VPC に接続できます。

    • 手順:

      1. ENI ベースの専用回線接続を有効にします。詳細については、「Spark から VPC タイプのインスタンスにアクセスする」をご参照ください。

      2. アクセスするサービスで、MaxCompute を表すセキュリティグループ (前のステップで指定したセキュリティグループ) が特定のポートにアクセスすることを許可するホワイトリストを追加します。

        たとえば、ApsaraDB RDS にアクセスするには、RDS にルールを追加して、ステップ 1 で作成したセキュリティグループからのアクセスを許可する必要があります。アクセスしたいサービスにセキュリティグループを追加できず、IP アドレスしか追加できない場合は、ステップ 1 で使用した vSwitch の CIDR ブロックを追加する必要があります。

      3. ジョブに spark.hadoop.odps.cupid.eni.info および spark.hadoop.odps.cupid.eni.enable パラメーターを設定します。

        次の例にサンプル構成を示します。RegionID と VPCID を実際の値に置き換えてください。

        ## 次の構成は、DataWorks の設定項目または spark-defaults.conf ファイルに追加する必要があります。
        
        spark.hadoop.odps.cupid.eni.enable = true
        spark.hadoop.odps.cupid.eni.info = [regionid]:[vpcid]

インターネットにアクセスするにはどうすればよいですか?

MaxCompute 上の Spark は、パブリックサービスにアクセスするために次の 2 つのメソッドをサポートしています。

  • ENI 接続経由のアクセス

    1. ENI ベースの専用回線接続を有効にします。詳細については、「Spark から VPC タイプのインスタンスにアクセスする」をご参照ください。

    2. 専用回線の VPC がインターネットにアクセスできることを確認してください。詳細については、「インターネット NAT ゲートウェイの SNAT 機能を使用してインターネットにアクセスする」をご参照ください。

    3. 次のサンプルコマンドを使用して、Spark ジョブレベルでパブリックアクセスホワイトリストを設定し、ENI を有効にします。RegionID と VPCID を実際の値に置き換えてください。

       ## 次の構成は、DataWorks の設定項目または spark-defaults.conf ファイルに追加する必要があります。
      spark.hadoop.odps.cupid.internet.access.list=aliyundoc.com:443
      spark.hadoop.odps.cupid.eni.enable=true
      spark.hadoop.odps.cupid.eni.info=[region]:[vpcid]
  • SmartNAT 経由のアクセス

    制限: このメソッドは Spark 3.4 以降のバージョンではサポートされていません。

    https://aliyundoc.com:443 にアクセスする必要があるとします。次の手順に従うことができます。

    1. DingTalk グループ ID 11782920 を検索して MaxCompute 開発者コミュニティに参加できます。MaxCompute テクニカルサポートチームに連絡して、https://aliyundoc.com:443odps.security.outbound.internetlist に追加してください。

    2. 次のサンプルコマンドを使用して、Spark ジョブレベルでパブリックアクセスホワイトリストを設定し、SmartNAT を有効にします。

    3. ## 次の構成は、DataWorks の設定項目または spark-defaults.conf ファイルに追加する必要があります。
      spark.hadoop.odps.cupid.internet.access.list=aliyundoc.com:443
      spark.hadoop.odps.cupid.smartnat.enable=true

OSS にアクセスするにはどうすればよいですか?

MaxCompute 上の Spark は、Jindo software development kit (SDK) を介した Alibaba Cloud OSS へのアクセスをサポートしています。次の情報を設定する必要があります。

  • Jindo SDK と OSS エンドポイントを設定します。

    次のコードにサンプルコマンドを示します。

    ## JindoSDK JAR パッケージを参照します。次の構成は、DataWorks の設定項目または spark-defaults.conf ファイルに追加する必要があります。
    spark.hadoop.odps.cupid.resources=public.jindofs-sdk-3.7.2.jar
    
    ## OSS 実装クラスを設定します。
    spark.hadoop.fs.AbstractFileSystem.oss.impl=com.aliyun.emr.fs.oss.OSS
    spark.hadoop.fs.oss.impl=com.aliyun.emr.fs.oss.JindoOssFileSystem
    
    ## OSS エンドポイントを設定します。
    spark.hadoop.fs.oss.endpoint=oss-[YourRegionId]-internal.aliyuncs.com
    
    ## 通常、OSS エンドポイントにネットワークホワイトリストを設定する必要はありません。ジョブの実行中にネットワークが切断された場合は、次のパラメーターを使用してホワイトリストを追加できます。
    ## 次の構成は、DataWorks の設定項目または spark-defaults.conf ファイルに追加する必要があります。
    spark.hadoop.odps.cupid.trusted.services.access.list=[YourBucketName].oss-[YourRegionId]-internal.aliyuncs.com
    説明

    MaxCompute 上の Spark がクラスターモードで実行される場合、内部 OSS エンドポイントのみがサポートされます。パブリック OSS エンドポイントはサポートされていません。OSS リージョンとエンドポイントのマッピングの詳細については、「OSS のリージョンとエンドポイント」をご参照ください。

  • OSS 認証情報を設定します。Jindo SDK は、次の 2 つの認証方式をサポートしています。

    • AccessKey ペアを認証に使用します。次のコードにサンプル構成を示します。

      val conf = new SparkConf()
        .setAppName("jindo-sdk-demo")
        # AccessKey 認証パラメーターを設定します。
        .set("spark.hadoop.fs.oss.accessKeyId", "<YourAccessKeyId>")
        .set("spark.hadoop.fs.oss.accessKeySecret", "<YourAccessKeySecret>")
    • Security Token Service (STS) トークンを認証に使用します。次の手順に従ってください。

      1. ワンクリック権限付与 をクリックして、MaxCompute プロジェクトが STS トークンを使用して現在の Alibaba Cloud アカウントの OSS リソースにアクセスすることを承認します。

        説明

        ワンクリック権限付与は、MaxCompute プロジェクトと OSS リソースが同じ Alibaba Cloud アカウントによって所有されている場合にのみ使用できます。

      2. ローカル HTTP サービスを設定して有効にします。

        次のコードにサンプルコマンドを示します。

        ## 次の構成は、DataWorks の設定項目または spark-defaults.conf ファイルに追加する必要があります。
        spark.hadoop.odps.cupid.http.server.enable = true
      3. 認証情報を設定します。

        次のコードにサンプルコマンドを示します。

        val conf = new SparkConf()
          .setAppName("jindo-sdk-demo")
          # クラウドサービスロール認証を設定します。
          # ${aliyun-uid} は Alibaba Cloud アカウントの UID です。
          # ${role-name} はロール名です。
          .set("spark.hadoop.fs.jfs.cache.oss.credentials.provider", "com.aliyun.emr.fs.auth.CustomCredentialsProvider")
          .set("spark.hadoop.aliyun.oss.provider.url", "http://localhost:10011/sts-token-info?user_id=${aliyun-uid}&role=${role-name}")

サードパーティの Python ライブラリを参照する方法

  • 症状: PySpark ジョブの実行時に No module named 'xxx' 例外がスローされます。

  • 原因: PySpark ジョブは、MaxCompute プラットフォームのデフォルトの Python 環境にインストールされていないサードパーティの Python ライブラリに依存しています。

  • 解決策: 次のいずれかのメソッドを使用して、サードパーティのライブラリ依存関係を追加できます。

    • MaxCompute のパブリック Python 環境を使用する。

      DataWorks の設定項目または spark-defaults.conf ファイルに次の構成を追加するだけで済みます。次のコードは、さまざまな Python バージョンの構成を示しています。

      • Python 2 の構成

        ## Python 2.7.13 構成
        ## 次の構成は、DataWorks の設定項目または spark-defaults.conf ファイルに追加する必要があります。
        spark.hadoop.odps.cupid.resources = public.python-2.7.13-ucs4.tar.gz
        spark.pyspark.python = ./public.python-2.7.13-ucs4.tar.gz/python-2.7.13-ucs4/bin/python
        
        ## サードパーティライブラリのリスト
        https://odps-repo.oss-cn-hangzhou.aliyuncs.com/pyspark/py27/py27-default_req.txt
      • Python 3 の構成

        ## Python 3.7.9 構成
        ## 次の構成は、DataWorks の設定項目または spark-defaults.conf ファイルに追加する必要があります。
        spark.hadoop.odps.cupid.resources = public.python-3.7.9-ucs4.tar.gz
        spark.pyspark.python = ./public.python-3.7.9-ucs4.tar.gz/python-3.7.9-ucs4/bin/python3
        
        ## サードパーティライブラリのリスト
        https://odps-repo.oss-cn-hangzhou.aliyuncs.com/pyspark/py37/py37-default_req.txt
    • 単一の WHEEL パッケージをアップロードする。

      このメソッドは、サードパーティの Python 依存関係が少なく単純なシナリオに適しています。以下にサンプルコマンドを示します。

      ## wheel パッケージの名前を zip パッケージに変更します。たとえば、pymysql wheel パッケージの名前を pymysql.zip に変更します。
      ## 名前を変更した zip パッケージをアップロードします (ファイルタイプ: archive)。
      ## DataWorks Spark ノードで zip パッケージを参照します (アーカイブタイプ)。
      ## パッケージをインポートする前に、次の構成を spark-defaults.conf ファイルまたは DataWorks の設定項目に追加します。
      ## 構成
      spark.executorEnv.PYTHONPATH=pymysql
      spark.yarn.appMasterEnv.PYTHONPATH=pymysql
      
      ## アップロードコード
      import pymysql
    • 完全なカスタム Python 環境をアップロードします。

      このメソッドは、依存関係が複雑な場合や、カスタムの Python バージョンが必要なシナリオに適しています。Docker コンテナーを使用して、完全な Python 環境をパッケージ化してアップロードする必要があります。詳細については、「パッケージの依存関係」をご参照ください。

JAR の依存関係の競合を解決する方法

  • 症状: 実行時に NoClassDefFoundError or NoSuchMethodError 例外がスローされます。

  • 原因: この問題は通常、JAR パッケージ内のサードパーティ依存関係のバージョンが Spark の依存関係バージョンと競合するために発生します。アップロードされたメイン JAR パッケージとサードパーティの依存関係ライブラリをチェックして、競合する依存関係を除外できます。

  • 解決策:

    • pom.xml ファイルでセルフチェックを実行します。

      • Spark コミュニティ版の依存関係を Provided に設定します。

      • Hadoop コミュニティ版の依存関係を Provided に設定します。

      • ODPS/Cupid の依存関係を Provided に設定します。

    • 競合する依存関係を除外します。

    • maven-shade-plugin relocation を使用してパッケージの競合を解決します。

ローカルモードでデバッグするにはどうすればよいですか?

  • Spark 2.3.0

    1. spark-defaults.conf ファイルに次の設定を追加します。

      spark.hadoop.odps.project.name =<Yourprojectname>
      spark.hadoop.odps.access.id =<YourAccessKeyID>
      spark.hadoop.odps.access.key =<YourAccessKeySecret>
      spark.hadoop.odps.end.point =<endpoint>
    2. ローカルモードでタスクを実行します。

      ./bin/spark-submit --master local spark_sql.py
  • Spark 2.4.5/Spark 3.1.1

    1. odps.conf という名前のファイルを作成し、次の構成をファイルに追加します。

      odps.access.id=<YourAccessKeyID>
      odps.access.key=<YourAccessKeySecret>
      odps.end.point=<endpoint>
      odps.project.name=<Yourprojectname>
    2. odps.conf ファイルの場所を示す環境変数を追加します。

      export ODPS_CONF_FILE=/path/to/odps.conf
    3. ローカルモードでタスクを実行します。

      ./bin/spark-submit --master local spark_sql.py
  • 一般的なエラー

    • エラー 1:

      • エラーメッセージ:

        • Incomplete config, no accessId or accessKey.

        • Incomplete config, no odps.service.endpoint.

      • 原因: ローカルモードで EventLog が有効になっています。

      • 解決策: spark-defaults.conf ファイルから spark.eventLog.enabled=true パラメーターを削除します。

    • エラー 2:

      • エラーメッセージ: Cannot create CupidSession with empty CupidConf.

      • 原因: Spark 2.4.5 または Spark 3.1.1 は odps.access.id などの情報を読み取ることができません。

      • odps.conf ファイルを作成し、環境変数を追加して、タスクを実行します。

    • エラー 3:

      • エラーメッセージ: java.util.NoSuchElementException: odps.access.id.

      • 原因: Spark 2.3.0 はodps.access.id などの情報を読み取ることができません。

      • 解決策: spark.hadoop.odps.access.id などの構成情報を spark-defaults.conf ファイルに追加します。

Spark ジョブの実行時に "User signature does not match" エラーが発生した場合はどうすればよいですか?

  • 症状

    Spark ジョブを実行すると、次のエラーが返されます。

    スタック:
    com.aliyun.odps.OdpsException: ODPS-0410042:
    無効な署名値 - ユーザー署名が一致しません
  • 原因

    ID 検証に失敗しました。AccessKey ID または AccessKey Secret が正しくありません。

  • 解決策

    spark-defaults.conf ファイル内の AccessKey ID と AccessKey Secret が、Alibaba Cloud コンソールの ユーザー情報管理[AccessKey ID] および [AccessKey Secret] と一致しているかどうかを確認します。一致しない場合は、一致するように変更します。

Spark ジョブの実行時に "You have NO privilege" エラーが発生した場合はどうすればよいですか?

  • 症状

    Spark ジョブを実行すると、次のエラーが返されます。

    スタック:
    com.aliyun.odps.OdpsException: ODPS-0420095:
    アクセスが拒否されました - 認証に失敗しました [4019]、{acs:odps:*:projects/*} に対する 'odps:CreateResource' 権限がありません
  • 原因

    必要な権限がありません。

  • 解決策

    プロジェクトのオーナーは、リソースに対する読み取りおよび作成権限を付与する必要があります。権限付与の詳細については、「MaxCompute の権限」をご参照ください。

Spark ジョブの実行時に "Access Denied" エラーが発生した場合はどうすればよいですか?

  • 症状

    Spark ジョブを実行すると、次のエラーが返されます。

    スレッド「main」の例外 org.apache.hadoop.yarn.exceptions.YarnException: com.aliyun.odps.OdpsException: ODPS-0420095: アクセスが拒否されました - タスクがリリース範囲内にありません: CUPID
  • 原因

    • 原因 1: spark-defaults.conf ファイルに設定されている AccessKey ID または AccessKey Secret が正しくありません。

    • 原因 2: プロジェクトが存在するリージョンでは、MaxCompute 上の Spark を使用できません。

  • 解決策

    • 原因 1 の解決策: spark-defaults.conf ファイルの構成を確認します。AccessKey ID と AccessKey Secret を正しい値に変更します。詳細については、「Linux 開発環境のセットアップ」をご参照ください。

    • 原因 2 の解決策: プロジェクトが存在するリージョンで MaxCompute 上の Spark が利用可能かどうかを確認するか、DingTalk グループ 21969532 (Spark on MaxCompute サポート) に参加して相談してください。

Spark ジョブの実行時に "No space left on device" エラーが発生した場合はどうすればよいですか?

Spark はローカル記憶域にディスクを使用します。シャッフルデータと BlockManager からオーバーフローしたデータはこれらのディスクに保存されます。ディスクサイズは spark.hadoop.odps.cupid.disk.driver.device_size パラメーターによって制御されます。デフォルトサイズは 20 GB で、最大サイズは 100 GB です。ディスクサイズを 100 GB に増やしてもエラーが解決しない場合は、原因を分析する必要があります。一般的な原因はデータスキューで、シャッフルまたはキャッシュプロセス中にデータが少数のブロックに集中します。この場合、エグゼキュータあたりのコア数 (spark.executor.cores) を減らし、エグゼキュータの数 (spark.executor.instances) を増やすことができます。

Spark ジョブの実行時に "Table or view not found" エラーが発生した場合はどうすればよいですか?

  • 症状

    Spark ジョブを実行すると、次のエラーが返されます。

    テーブルまたはビューが見つかりません:xxx
  • 原因

    • 原因 1: テーブルまたはビューが存在しません。

    • 原因 2: Hive カタログ構成が有効になっています。

  • 解決策

    • 原因 1 の解決策: テーブルを作成します。

    • 原因 2 の解決策: カタログ構成を削除します。たとえば、次のコードでは enableHiveSupport() を削除します。

      spark = SparkSession.builder.appName(app_name).enableHiveSupport().getOrCreate()

Spark ジョブの実行時に "Shutdown hook called before final status was reported" エラーが発生した場合はどうすればよいですか?

  • 症状

    Spark ジョブを実行すると、次のエラーが返されます。

    アプリのステータス: 成功、診断: 最終ステータスが報告される前にシャットダウンフックが呼び出されました。
  • 原因

    クラスターに送信されたメインアプリケーションは、ApplicationMaster (AM) を介してクラスターリソースを要求しませんでした。たとえば、SparkContext が作成されなかったか、コードで spark.master が local に設定されていました。

Spark ジョブの実行時に JAR パッケージのバージョン競合エラーが発生した場合はどうすればよいですか?

  • 症状

    Spark ジョブを実行すると、次のエラーが返されます。

    ユーザークラスが例外をスローしました: java.lang.NoSuchMethodError
  • 原因

    JAR パッケージのバージョン競合またはクラスエラーが発生しました。

  • 解決策

    1. $SPARK_HOME/jars パスで、エラーの原因となっているクラスが配置されている JAR パッケージを見つけます。次に、次のコマンドを実行して、サードパーティライブラリの座標とバージョンを特定します。

      grep <AbnormalClassName> $SPARK_HOME/jars/*.jar
    2. Spark ジョブのルートディレクトリで、次のコマンドを実行して、プロジェクト全体のすべての依存関係を表示します。

      mvn dependency:tree
    3. 対応する依存関係を見つけたら、次のコマンドを実行して、競合するパッケージを除外します。

      maven dependency exclusions
    4. コードを再コンパイルして送信します。

Spark ジョブの実行時に "ClassNotFound" エラーが発生した場合はどうすればよいですか?

  • 症状

    Spark ジョブを実行すると、次のエラーが返されます。

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

    クラスが存在しないか、依存関係が正しく構成されていません。

  • 解決策

    1. 次のコマンドを実行して、送信した JAR パッケージにクラス定義が存在するかどうかを確認します。

      jar -tf <JobJARFile> | grep <ClassName>
    2. pom.xml ファイルの依存関係が正しいかどうかを確認します。

    3. Shade メソッドを使用して JAR パッケージを送信します。

Spark ジョブの実行時に "The task is not in release range" エラーが発生した場合はどうすればよいですか?

  • 症状

    Spark ジョブを実行すると、次のエラーが返されます。

    タスクがリリース範囲内にありません: CUPID
  • 原因

    プロジェクトが存在するリージョンで MaxCompute 上の Spark サービスが有効になっていません。

  • 解決策

    MaxCompute 上の Spark サービスが有効になっているリージョンを選択します。

Spark ジョブの実行時に "java.io.UTFDataFormatException" エラーが発生した場合はどうすればよいですか?

  • 症状

    Spark ジョブを実行すると、次のエラーが返されます。

    java.io.UTFDataFormatException: エンコードされた文字列が長すぎます: 2818545 バイト
  • 解決策

    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 タイプのインスタンスにアクセスする」をご参照ください。