このトピックでは、MaxCompute 上の 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 { // オブジェクトを定義する必要があります。IntelliJ IDEA でファイルを作成するときに、コードにオブジェクトではなくクラスを記述すると、メイン関数をロードできません。 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 ノードを実行する方法
オンプレミスの Python 環境で Spark コードを変更およびパッケージ化します。オンプレミスの Python 環境のバージョンが Python 2.7 であることを確認してください。
リソースパッケージを DataWorks にアップロードします。詳細については、「MaxCompute リソースの作成と使用」をご参照ください。
DataWorks で ODPS Spark ノードを作成します。詳細については、「ODPS Spark ノードの作成」をご参照ください。
コードを記述してノードを実行します。次に、DataWorks コンソールで実行結果を表示します。
オンプレミス環境で MaxCompute 上の Spark をデバッグする方法
IntelliJ IDEA を使用して、オンプレミス環境で MaxCompute 上の Spark をデバッグします。詳細については、「Linux 開発環境のセットアップ」をご参照ください。
MaxCompute 上の Spark を使用して VPC 内のサービスにアクセスする方法
MaxCompute 上の Spark を使用して Virtual Private Cloud (VPC)内のサービスにアクセスする方法の詳細については、「MaxCompute 上の Spark から VPC 内のインスタンスにアクセスする」をご参照ください。
JAR ファイルをリソースとして参照する方法
spark.hadoop.odps.cupid.resources
パラメーターを使用して、参照するリソースを指定できます。 リソースは複数のプロジェクトで共有できます。 データセキュリティを確保するために、関連する権限を構成することをお勧めします。 次の構成は例を示しています。
spark.hadoop.odps.cupid.resources = projectname.xx0.jar,projectname.xx1.jar
MaxCompute 上の Spark を使用してパラメータを渡す方法
MaxCompute 上の Spark を使用してパラメータを渡す方法の詳細については、GitHub の「Spark on DataWorks」をご参照ください。
ストリーミングモードで Spark によって読み取られた DataHub データを MaxCompute に書き込む方法
サンプルコードについては、DataHub をご覧ください。
オープンソースの Spark コードを MaxCompute 上の Spark に移行する方法
ジョブのシナリオに基づいて、次の移行ソリューションのいずれかを選択します。
ジョブで MaxCompute テーブルまたは Object Storage Service (OSS)へのアクセスが不要な場合。
既存の JAR ファイルを実行します。詳細については、「Linux 開発環境のセットアップ」をご参照ください。 Spark または Hadoop の場合、依存関係のスコープを provided に設定する必要があります。
ジョブで MaxCompute テーブルへのアクセスが必要な場合。
依存関係を設定して再パッケージ化します。詳細については、「Linux 開発環境のセットアップ」をご参照ください。
ジョブで OSS へのアクセスが必要な場合。
OSS にアクセスするために必要なパッケージを取得し、「ネットワーク接続を確立する」をご参照ください。 その後、デプロイおよび実行のためにアプリケーションを再コンパイルしてパッケージ化します。 詳細については、「Linux 開発環境をセットアップする」をご参照ください。
MaxCompute 上の Spark を使用して MaxCompute テーブル内のデータを処理する方法
ローカル、クラスタ、または DataWorks モードで MaxCompute 上の Spark を使用して、MaxCompute テーブル内のデータを処理します。3 つのモードの設定の違いについては、「実行モード」をご参照ください。
MaxCompute 上の Spark のリソース並列処理を設定する方法
MaxCompute 上の Spark のリソース並列処理は、エグゼキュータの数と各エグゼキュータの CPU コアの数に基づいて決定されます。並列に実行できるタスクの最大数は、次の数式を使用して計算されます。エグゼキュータの数 × 各エグゼキュータの CPU コアの数
。
エグゼキュータの数
パラメータ:
spark.executor.instances
。パラメータの説明: ジョブによって要求されるエグゼキュータの数を指定します。
各エグゼキュータの CPU コアの数
パラメータ:
spark.executor.cores
。パラメータの説明: 各エグゼキュータ プロセスの CPU コア数を指定します。このパラメータは、各エグゼキュータ プロセスがタスクを並列実行する機能を決定します。各 CPU コアは、一度に 1 つのタスクしか実行できません。ほとんどの場合、各エグゼキュータの CPU コア数を
2~4
に設定することをお勧めします。
OOM 問題を解決する方法
一般的なエラー:
java.lang.OutOfMemoryError: Java heap space
。java.lang.OutOfMemoryError: GC overhead limit exceeded
。Cannot allocate memory
。The job has been killed by "OOM Killer", please check your job's memory usage
。
解決策:
各エグゼキュータのメモリサイズを設定します。
パラメーター:
spark.executor.memory
。パラメーターの説明: このパラメーターは、各 Executor のメモリサイズを指定します。
1:4
の比率でspark.executor.cores
と spark.executor.memory を設定することをお勧めします。たとえば、spark.executor.cores
が1
に設定されている場合は、spark.executor.memory
を4 GB
に設定できます。Executor でエラーメッセージjava.lang.OutOfMemoryError
が報告された場合は、パラメーター値を増やす必要があります。
各エグゼキュータのオフヒープメモリを設定します。
パラメーター:
spark.executor.memoryOverhead
。パラメーターの説明: このパラメーターは、各 Executor の追加メモリサイズを指定します。追加メモリは、主に Java 仮想マシン (JVM)、文字列、および NIO バッファーのオーバーヘッドに使用されます。デフォルトのメモリサイズは、次の式を使用して計算されます:
spark.executor.memory * 0.1
。最小サイズは 384 MB です。ほとんどの場合、デフォルト値を変更する必要はありません。Executor でエラーメッセージCannot allocate memory
または OOM Killer がログに記録された場合は、パラメーター値を増やす必要があります。
ドライバメモリを設定します。
パラメーター:
spark.driver.memory
。パラメーターの説明: このパラメーターは、ドライバーのメモリサイズを指定します。
1:4
の比率のspark.driver.cores
と spark.driver.memory の間が推奨されます。ドライバーが大量のデータを収集する必要がある場合、またはエラーメッセージ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 内のリソースにアクセスするには、次のいずれかの方法を使用します。
方法 1: 指定されたパラメータを設定して、MaxCompute リソースを直接参照します。
パラメーター:
spark.hadoop.odps.cupid.resources
。パラメーター形式:
<projectname>.<resourcename>[:<newresourcename>]
。パラメーターの説明: このパラメーターは、タスクの実行に必要な MaxCompute リソースを指定します。詳細については、「リソース操作」をご参照ください。指定されたリソースは、ドライバーとエグゼキューターの現在の作業ディレクトリにダウンロードされます。同じタスクで複数のリソースを参照できます。リソースはカンマ (,) で区切ります。リソースのデフォルト名は、作業ディレクトリにダウンロードされた後、
<projectname>.<resourcename>
の形式になります。このパラメーターを構成する場合は、<projectname>.<resourcename>:<newresourcename>
形式でリソースの名前を変更します。このパラメーターは、このパラメーターをspark-default.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 を参照し、public.myjar.jar を myjar.jar に名前変更します。 --> spark.hadoop.odps.cupid.resources=public.myjar.jar:myjar.jar
方法 2: DataWorks 内のリソースを参照します。
DataWorks DataStudio ページで、MaxCompute 内のリソースをビジネスワークフローに追加します。詳細については、「MaxCompute リソースの管理」をご参照ください。
DataWorks の ODPS Spark ノードで、JAR ファイル、ファイル、およびアーカイブファイルをリソースとして選択します。
説明この方法を使用すると、タスクの実行時にリソースがアップロードされます。大量のリソースの場合は、方法 1 を使用してリソースを参照することをお勧めします。
MaxCompute 上の Spark を使用して VPC にアクセスする方法
Alibaba Cloud VPC 内のサービスにアクセスするには、次のいずれかの方法を使用します。
リバースアクセス
制限
MaxCompute 上の Spark を使用して、MaxCompute と同じリージョンにある Alibaba Cloud VPC にのみアクセスできます。
手順:
CIDR ブロック
100.104.0.0/16
からのアクセスを許可するように、アクセスするサービスに IP アドレスのホワイトリストを追加します。ジョブの
spark.hadoop.odps.cupid.vpc.domain.list
パラメーターを構成します。このパラメータは、アクセスする必要がある 1 つ以上のインスタンスのネットワーク状況を反映します。パラメータ値は JSON 形式です。JSON 値を 1 行に変換する必要があります。次の例では、regionId、vpcId、domain、および port の値を実際のリージョン ID、VPC ID、ドメイン名、およびポート番号に置き換える必要があります。
<!-- DataWorks パラメータまたは spark-defaults.conf ファイルに次の設定を追加します。 --> spark.hadoop.odps.cupid.vpc.domain.list={"regionId":"cn-beijing","vpcs":[{"vpcId":"vpc-2zeaeq21mb1dmkqh*****","zones":[{"urls":[{"domain":"dds-2ze3230cfea0*****.mongodb.rds.aliyuncs.com","port":3717},{"domain":"dds-2ze3230cfea0*****.mongodb.rds.aliyuncs.com","port":3717}]}]}]}
ENI ベースのアクセス
制限
Elastic Network Interface (ENI)を使用して、MaxCompute 上の Spark を MaxCompute と同じリージョンにある VPC に接続できます。ジョブで複数の VPC に同時にアクセスする必要がある場合は、ENI を使用して接続されている VPC を別の VPC に接続できます。
手順:
MaxCompute 上の Spark から VPC 内のインスタンスにアクセスするの手順に従って、ENI を作成します。
アクセスするサービスにホワイトリストを追加し、手順 i で作成した MaxCompute セキュリティグループに特定のポートへのアクセスを承認します。
たとえば、ApsaraDB RDS インスタンスにアクセスする必要がある場合は、手順 i で作成したセキュリティグループからのアクセスを許可するように、インスタンスにセキュリティグループルールを追加する必要があります。アクセスする必要があるサービスにセキュリティグループを追加できない場合は、手順 i で使用した vSwitch CIDR ブロックを追加する必要があります。
ジョブの
spark.hadoop.odps.cupid.eni.info
パラメーターとspark.hadoop.odps.cupid.eni.enable
パラメーターを構成します。次の例では、regionid を実際のリージョン ID に、vpcid を実際の VPC ID に置き換えます。
<!-- DataWorks パラメータまたは spark-defaults.conf ファイルに次の設定を追加します。 --> spark.hadoop.odps.cupid.eni.enable = true spark.hadoop.odps.cupid.eni.info = [regionid]:[vpcid]
インターネットにアクセスする方法
インターネットにアクセスするには、次のいずれかの方法を使用します。
ENI ベースのアクセス
MaxCompute の Spark から VPC 内のインスタンスにアクセスするの手順に従って ENI を作成します。
ENI を使用して VPC がインターネットにアクセスできることを確認します。 詳細については、「インターネット NAT ゲートウェイの SNAT 機能を使用してインターネットにアクセスする」をご参照ください。
次の設定を使用して、インターネット経由のアクセスのためのホワイトリストを構成し、Spark ジョブの ENI を有効にします。 リージョン ID を実際のリージョン ID に、vpcid を実際の VPC ID に置き換えます。
## Add the following configurations to the DataWorks parameters or the spark-defaults.conf file. 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
にアクセスする必要があります。次の手順を実行します。チケットを送信するか、DingTalk グループ(ID: 11782920)を検索して MaxCompute 開発者コミュニティに参加します。 その後、MaxCompute テクニカルサポートエンジニアに
https://aliyundoc.com:443
をodps.security.outbound.internetlist
に追加するように依頼します。次の設定を使用して、インターネット経由のアクセスのためのホワイトリストを設定し、Spark ジョブの SmartNAT を有効にします。
<!-- 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 SDK を使用して Alibaba Cloud OSS にアクセスできます。次の情報を設定する必要があります。
Jindo SDK と OSS エンドポイントを設定します。
次のコードは例を示しています。
## Jindo SDK 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 認証情報を設定します。Jindo SDK は、次の認証方式をサポートしています。
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)トークンを使用して認証します。
クラウド リソースアクセス承認 ページに移動し、[承認ポリシーの確認] をクリックします。その後、MaxCompute プロジェクトは STS トークンを使用して、現在の Alibaba Cloud アカウントの OSS リソースにアクセスできます。
説明この操作は、MaxCompute プロジェクトの所有者が、アクセスされる OSS リソースを所有する Alibaba Cloud アカウントである場合にのみ実行できます。
ローカル HTTP サービスを有効にします。
次のコードは例を示しています。
<!-- DataWorks パラメータまたは spark-defaults.conf ファイルに次の設定を追加します。 --> spark.hadoop.odps.cupid.http.server.enable = true
認証情報を設定します。
次のコードは例を示しています。
val conf = new SparkConf() .setAppName("jindo-sdk-demo") # 認証のために Alibaba Cloud アカウントの RAM ロールを設定します。 # ${aliyun-uid} は、Alibaba Cloud アカウントの一意の ID を指定します。 # ${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 ジョブはサードパーティの Python ライブラリに依存しています。ただし、サードパーティの Python ライブラリは、現在の MaxCompute プラットフォームのデフォルトの 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 に変更します。 --> <!-- pymysql.zip ファイルをアーカイブタイプのリソースとしてアップロードします。 --> <!-- DataWorks Spark ノードでアーカイブファイルを参照します。 --> <!-- spark-defaults.conf ファイルまたは DataWorks パラメータに次の設定を追加し、インポート操作を実行します。 --> <!-- 設定を追加します。 --> spark.executorEnv.PYTHONPATH=pymysql spark.yarn.appMasterEnv.PYTHONPATH=pymysql <!-- コードをアップロードします。 --> import pymysql
完全なカスタム Python 環境をアップロードします。
この解決策は、依存関係が複雑な場合、またはカスタム Python バージョンが必要な場合に適しています。Docker コンテナを使用して、完全な Python 環境をパッケージ化してアップロードする必要があります。詳細については、「依存関係をパッケージ化する」の「必要なパッケージをアップロードする」セクションをご参照ください。
JAR の依存関係の競合を解決する方法
問題の説明: 実行時に
NoClassDefFoundError または NoSuchMethodError
エラーメッセージが表示されます。考えられる原因: JAR ファイル内のサードパーティ依存関係と Spark 依存関係間のバージョンの競合。アップロードするメインの JAR ファイルとサードパーティの依存関係ライブラリを調べて、どの依存関係がバージョンの競合を引き起こしているかを特定する必要があります。
解決策:
POM ファイルを確認します。
Apache Spark 依存関係のスコープが provided に設定されていることを確認します。
Apache Hadoop 依存関係のスコープが provided に設定されていることを確認します。
Odps または Cupid 依存関係のスコープが provided に設定されていることを確認します。
バージョン競合の原因となっている依存関係を除外します。
maven-shade-plugin
によって提供される再配置機能を使用して、問題を解決します。
ローカルモードで MaxCompute 上の Spark をデバッグする方法
Spark 2.3.0
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>
ジョブをローカルモードで実行します。
./bin/spark-submit --master local spark_sql.py
Spark 2.4.5/Spark 3.1.1
odps.conf
という名前のファイルを作成し、次の構成をファイルに追加します。odps.access.id=<YourAccessKeyID> odps.access.key=<YourAccessKeySecret> odps.end.point=<endpoint> odps.project.name=<Yourprojectname>
odps.conf
ファイルのパスを指す環境変数を追加します。export ODPS_CONF_FILE=/path/to/odps.conf
ジョブをローカルモードで実行します。
./bin/spark-submit --master local spark_sql.py
一般的なエラー
エラー 1:
エラーメッセージ:
Incomplete config, no accessId or accessKey
.Incomplete config, no odps.service.endpoint
.
考えられる原因: ローカルモードでイベントロギングが有効になっています。
解決策:
spark.eventLog.enabled=true
構成をspark-defaults.conf
ファイルから削除します。
エラー 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 ジョブの実行時に「ユーザー署名が一致しません」というエラーメッセージが表示された場合の対処方法
問題の説明
Spark ジョブの実行時に、次のエラーメッセージが表示されます。
スタック: com.aliyun.odps.OdpsException: ODPS-0410042: 無効な署名値 - ユーザー署名が一致しません
原因
身元認証に失敗しました。AccessKey ID または AccessKey シークレットが無効です。
解決策
spark-defaults.conf ファイルのアクセスキー ID とアクセスキーシークレットが、Alibaba Cloud コンソールの [ユーザー管理] にある [アクセスキー ID] と [アクセスキーシークレット] と同じであるかどうかを確認します。同じでない場合は、ファイル内のアクセスキー ID とアクセスキーシークレットを変更します。
Spark ジョブの実行時に「権限がありません」というエラーメッセージが表示された場合の対処方法
問題の説明
Spark ジョブの実行時に、次のエラーメッセージが表示されます。
スタック: com.aliyun.odps.OdpsException: ODPS-0420095: アクセスが拒否されました - 認証に失敗しました [4019]、{acs:odps:*:projects/*} に対する 'odps:CreateResource' 権限がありません
原因
必要な権限がありません。
解決策
プロジェクトオーナーに、リソースに対する読み取り権限と作成権限をアカウントに付与するように依頼します。認証の詳細については、「MaxCompute 権限」をご参照ください。
Spark ジョブの実行時に「アクセスが拒否されました」というエラーメッセージが表示された場合の対処方法
問題の説明
Spark ジョブの実行時に、次のエラーメッセージが表示されます。
スレッド「main」の例外 org.apache.hadoop.yarn.exceptions.YarnException: com.aliyun.odps.OdpsException: ODPS-0420095: アクセスが拒否されました - タスクがリリース範囲内にありません: CUPID
原因
原因 1:Spark-defaults.conf ファイルに構成されている AccessKey ID と AccessKey シークレットが無効です。
原因 2: プロジェクトが存在するリージョンでは、MaxCompute 上の Spark を使用できません。
解決策
原因 1 の解決策:Spark-defaults.conf ファイルの構成情報を確認します。ファイル内の AccessKey ID と AccessKey シークレットが無効な場合は、変更します。詳細については、「Linux 開発環境をセットアップする」をご参照ください。
原因 2 の解決策: プロジェクトが存在するリージョンで MaxCompute 上の Spark が使用可能かどうかを確認するか、DingTalk グループ(ID: 21969532)に参加してテクニカルサポートを受けてください。
Spark ジョブの実行時に「デバイスに空き容量がありません」というエラーメッセージが表示された場合の対処方法
MaxCompute 上の Spark は、ローカルストレージにディスクを使用します。シャッフルデータと BlockManager からオーバーフローするデータはすべてディスクに保存されます。 spark.hadoop.odps.cupid.disk.driver.device_size パラメータを使用してディスクサイズを指定できます。デフォルト値は 20 GB、最大値は 100 GB です。ディスク容量を 100 GB に増やした後も問題が解決しない場合は、さらに問題を分析する必要があります。最も一般的な原因はデータスキューです。シャッフリングプロセスとキャッシュプロセス中に、データが特定のブロックに集中して分散されます。この場合は、spark.executor.cores パラメータの値を変更して単一のエグゼキュータの CPU コア数を減らし、spark.executor.instances パラメータの値を変更してエグゼキュータの数を増やします。
Spark ジョブの実行時に「テーブルまたはビューが見つかりません」というエラーメッセージが表示された場合の対処方法
問題の説明
Spark ジョブの実行時に、次のエラーメッセージが表示されます。
テーブルまたはビューが見つかりません:xxx
原因
原因 1: テーブルまたはビューが存在しません。
原因 2: Hive のカタログ設定が有効になっています。
解決策
原因 1 の解決策: テーブルを作成します。
原因 2 の解決策:カタログ構成を削除します。たとえば、次の構成では、
enableHiveSupport()
を削除します。spark = SparkSession.builder.appName(app_name).enableHiveSupport().getOrCreate()
Spark ジョブの実行時に「最終ステータスが報告される前にシャットダウンフックが呼び出されました」というエラーメッセージが表示された場合の対処方法
問題の説明
Spark ジョブの実行時に、次のエラーメッセージが表示されます。
アプリのステータス: 成功、診断: 最終ステータスが報告される前にシャットダウンフックが呼び出されました。
原因
クラスタに対して実行される main メソッドが、ApplicationMaster を使用してクラスタリソースを要求していません。たとえば、ユーザーが SparkContext を作成していないか、ユーザーがコードで spark.master を local に設定しています。
Spark ジョブの実行時に JAR パッケージのバージョン競合が発生した場合の対処方法
問題の説明
Spark ジョブの実行時に、次のエラーメッセージが表示されます。
ユーザークラスが例外をスローしました: 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 ファイルの依存関係が正しく設定されているかどうかを確認します。
Apache Maven Shade プラグインを使用して JAR ファイルを送信します。
Spark ジョブの実行時に「タスクがリリース範囲内にありません」というエラーメッセージが表示された場合の対処方法
問題の説明
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"
MaxCompute 上の Spark がインターネット経由でサードパーティのタスクを呼び出すときにエラーメッセージが表示された場合の対処方法
ネットワーク接続が切断されているため、MaxCompute 上の Spark はインターネット経由でサードパーティのタスクを直接呼び出すことができません。
この問題を解決するには、VPC に NGINX リバースプロキシを構築し、プロキシを使用してインターネットにアクセスします。MaxCompute 上の Spark は、VPC への直接アクセスをサポートしています。詳細については、「MaxCompute 上の Spark から VPC 内のインスタンスにアクセスする」をご参照ください。