注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

Sparkプロファイルのリファレンス

このページは、Foundryで利用可能なSparkプロファイルのリファレンスです。Sparkとプロファイルの詳細はこちらをご覧ください。

ドライバーコア

このファミリーのプロファイルは、spark.driver.coresの値を設定します。

これは、Sparkドライバーに割り当てられるCPUコアの数を制御します。実際には、多くのSparkジョブが同時に同じSparkモジュールで実行される特別な場合を除き、これを上書きする必要はありません。

ドライバーメモリ

このファミリーのプロファイルは、spark.driver.memoryの値を設定します。

これは、SparkドライバーJVMに割り当てられるメモリ量を制御します。例えば、大量のデータをドライバーに戻す場合や、大きなブロードキャスト結合を行う場合には、これを増やす必要があるかもしれません。

これはJVMのメモリのみを制御し、Pythonプロセスに利用可能なメモリは含まれません。データをローカルに引き出してPandasを使用してトランスフォームする場合は、別のプロファイルが必要です。

エグゼキュータコア

このファミリーのプロファイルは、spark.executor.coresの値を設定します。

これは各Sparkエグゼキュータに割り当てられるCPUコアの数を制御し、各エグゼキュータで同時に実行されるタスクの数を制御します。実際には、通常のトランスフォームジョブではこれを上書きする必要はほとんどありません。

エグゼキュータメモリ

このファミリーのプロファイルは、spark.executor.memoryおよび関連する設定の値を設定します。

これは各SparkエグゼキュータJVMに割り当てられるメモリ量を制御します。各Sparkタスクで処理されるデータ量が非常に大きい場合には、これを増やす必要があるかもしれません。

このメモリは、エグゼキュータで実行されるすべてのタスク間で共有されます(エグゼキュータコアプロファイルによって制御されます)。

エグゼキュータメモリオーバーヘッド

このファミリーのプロファイルは、spark.executor.memoryOverheadの値を設定します。

これは、SparkエグゼキュータJVMメモリに加えて各コンテナに割り当てられるメモリ量を制御します。ジョブがJVM外で大量のメモリを必要とする場合、これを増やす必要があるかもしれません。

エグゼキュータの数

このファミリーのプロファイルは、spark.executor.instancesおよび関連する設定の値を設定します。

これはジョブを実行するためにリクエストされるエグゼキュータの数を制御します。この値を増やすことで、並行して実行できるタスクの数が増え、パフォーマンスが向上します(ジョブが十分に並列化されている場合)。その代わりに、より多くのリソースを使用します。

実際には、非常に大きなジョブで特定の組織的なニーズがある場合にのみ、これを上書きする必要があります。

動的割り当て

このファミリーのプロファイルは、spark.dynamicAllocation.enabledspark.dynamicAllocation.minExecutors、およびspark.dynamicAllocation.maxExecutorsの値を設定します。

これは、固定された数ではなくエグゼキュータの範囲を指定することで、ジョブを実行するためにリクエストされるエグゼキュータの数を制御します。Sparkは、リクエストされたエグゼキュータの数を最大maxExecutorsまでスケールアップし、不要な場合にはエグゼキュータを解放します。必要なエグゼキュータの正確な数が一貫して同じでない場合や、一部のケースでは起動時間を短縮するために役立ちます。モジュールがリクエストされたmaxExecutorsの数を確実に受け取ることは保証されておらず、変動するエグゼキュータの数により、実行ごとにパフォーマンスが異なる場合があります。

実際には、動的割り当ての利点と欠点を十分に理解している大規模なジョブの場合にのみ、これを上書きする必要があります。

アダプティブクエリ実行

このファミリーのプロファイルは、アダプティブクエリ実行(AQE)の有効化と無効化を行います。

AQEが有効な場合、Sparkは実行時にパーティション数を自動的に設定し、ビルドを高速化する可能性があります。並列性が不十分なパーティションが少なすぎる問題や、小さすぎるパーティションが多すぎる問題を回避します。

AQEは、パーティションごとに64MBのバランスの取れた出力サイズを目指します。例えば、合計出力サイズが512MBの場合、約8つのパーティションが作成されます。

このファミリーのファイルサイズプロファイルを使用して、ターゲットサイズを増やすことができます。書き込まれたデータが頻繁に読み取られる場合(例えば、Contour分析で)、128MB以上のパーティションサイズが推奨されます。

総出力が小さいが計算に非常に時間がかかる場合(例えば、コストの高いUDFのため)、AQEを無効にすることを検討するかもしれません。その場合、AQEは並列性を低下させ、計算を遅くする可能性があります。

タスクごとのコア数

このファミリーのプロファイルは、spark.task.cpusの値を設定します。

これは各タスクに割り当てられるコア数を制御します。実際には、これを上書きする必要はほとんどありません。ジョブの並列性を制御したい場合は、エグゼキュータコアを検討すべきです。

Arrow

これらのプロファイルを使用して、PandasとPySparkデータフレーム間の変換のためにArrowを有効または無効にします。Arrowを使用するには、トランスフォームがpyarrowパッケージに依存していることを確認してください。

Pandasデータフレームを使用してspark.createDataFrame()を呼び出す場合や、toPandas()を呼び出す場合、Sparkはすべての行をシリアライズして、あるフォーマットから別のフォーマットに変換する必要があります。大きなデータフレームの場合、これは遅いプロセスであり、トランスフォームのボトルネックになる可能性があります。Pandasトランスフォームを使用する場合、このシリアライズはデータの読み取り時と書き込み時の両方で発生します。

Arrowはより効率的なシリアライズ形式であり、この変換を大幅に高速化します(Arrowのウェブサイト ↗で報告されています)。

Kubernetes

このファミリーのプロファイルは、ユーザーのSparkジョブが実行される方法の低レベルの詳細を制御します。

ライブラリが基盤となるマシンのCPUアーキテクチャに依存しない場合、プロファイルを使用してSparkジョブを特定のアーキテクチャで実行するように強制できます。特定の環境ではAMDアーキテクチャのマシンにのみアクセスできる場合があります。その環境ではARMアーキテクチャのオーバーライドを使用するジョブは成功しません。

プロファイルテーブル

プロファイルファミリープロファイル名Spark設定
ドライバーコアDRIVER_CORES_SMALLspark.driver.cores: 1
ドライバーコアDRIVER_CORES_MEDIUMspark.driver.cores: 2
ドライバーコアDRIVER_CORES_LARGEspark.driver.cores: 4
ドライバーコアDRIVER_CORES_EXTRA_LARGEspark.driver.cores: 8
ドライバーコアDRIVER_CORES_EXTRA_EXTRA_LARGEspark.driver.cores: 16
ドライバーメモリDRIVER_MEMORY_SMALLspark.driver.memory: 3g
ドライバーメモリDRIVER_MEMORY_MEDIUMspark.driver.memory: 6g; spark.driver.maxResultSize: 4g
ドライバーメモリDRIVER_MEMORY_LARGEspark.driver.memory: 13g; spark.driver.maxResultSize: 8g
ドライバーメモリDRIVER_MEMORY_EXTRA_LARGEspark.driver.memory: 27g; spark.driver.maxResultSize: 16g
ドライバーメモリDRIVER_MEMORY_EXTRA_EXTRA_LARGEspark.driver.memory: 54g; spark.driver.maxResultSize: 32g
ドライバーメモリオーバーヘッドDRIVER_MEMORY_OVERHEAD_SMALLspark.driver.memoryOverhead: 1g
ドライバーメモリオーバーヘッドDRIVER_MEMORY_OVERHEAD_MEDIUMspark.driver.memoryOverhead: 2g
ドライバーメモリオーバーヘッドDRIVER_MEMORY_OVERHEAD_LARGEspark.driver.memoryOverhead: 4g
ドライバーメモリオーバーヘッドDRIVER_MEMORY_OVERHEAD_EXTRA_LARGEspark.driver.memoryOverhead: 8g
ドライバーメモリオーバーヘッドDRIVER_MEMORY_OVERHEAD_EXTRA_EXTRA_LARGEspark.driver.memoryOverhead: 16g
エグゼキュータコアEXECUTOR_CORES_EXTRA_SMALLspark.executor.cores: 1
エグゼキュータコアEXECUTOR_CORES_SMALLspark.executor.cores: 2
エグゼキュータコアEXECUTOR_CORES_MEDIUMspark.executor.cores: 4
エグゼキュータコアEXECUTOR_CORES_LARGEspark.executor.cores: 6
エグゼキュータコアEXECUTOR_CORES_EXTRA_LARGEspark.executor.cores: 8
エグゼキュータメモリEXECUTOR_MEMORY_EXTRA_SMALLspark.executor.memory: 3g; spark.executor.memoryOverhead: 768m
エグゼキュータメモリEXECUTOR_MEMORY_SMALLspark.executor.memory: 6g; spark.executor.memoryOverhead: 1536m
エグゼキュータメモリEXECUTOR_MEMORY_MEDIUMspark.executor.memory: 13g; spark.executor.memoryOverhead: 2g
エグゼキュータメモリEXECUTOR_MEMORY_LARGEspark.executor.memory: 27g; spark.executor.memoryOverhead: 3g
エグゼキュータメモリオフヒープEXECUTOR_MEMORY_OFFHEAP_FRACTION_MINIMUMShare of memory to use for off-heap (an “Executor Memory“ profile must be set): 30%
エグゼキュータメモリオフヒープEXECUTOR_MEMORY_OFFHEAP_FRACTION_LOWShare of memory to use for off-heap (an “Executor Memory“ profile must be set): 50%
エグゼキュータメモリオフヒープEXECUTOR_MEMORY_OFFHEAP_FRACTION_MODERATEShare of memory to use for off-heap (an “Executor Memory“ profile must be set): 70%
エグゼキュータメモリオフヒープEXECUTOR_MEMORY_OFFHEAP_FRACTION_HIGHShare of memory to use for off-heap (an “Executor Memory“ profile must be set): 80%
エグゼキュータメモリオフヒープEXECUTOR_MEMORY_OFFHEAP_FRACTION_MAXIMUMShare of memory to use for off-heap (an “Executor Memory“ profile must be set): 90%
エグゼキュータメモリオーバーヘッドEXECUTOR_MEMORY_OVERHEAD_SMALLspark.executor.memoryOverhead: 1g
エグゼキュータメモリオーバーヘッドEXECUTOR_MEMORY_OVERHEAD_MEDIUMspark.executor.memoryOverhead: 2g
エグゼキュータメモリオーバーヘッドEXECUTOR_MEMORY_OVERHEAD_LARGEspark.executor.memoryOverhead: 4g
エグゼキュータメモリオーバーヘッドEXECUTOR_MEMORY_OVERHEAD_EXTRA_LARGEspark.executor.memoryOverhead: 8g
エグゼキュータ数KUBERNETES_NO_EXECUTORSspark.kubernetes.local.submission: true; spark.sql.shuffle.partitions: 1
エグゼキュータ数NUM_EXECUTORS_1spark.executor.instances: 1; spark.dynamicAllocation.maxExecutors: 1
エグゼキュータ数NUM_EXECUTORS_2spark.executor.instances: 2; spark.dynamicAllocation.maxExecutors: 2
エグゼキュータ数NUM_EXECUTORS_4spark.executor.instances: 4; spark.dynamicAllocation.maxExecutors: 4
エグゼキュータ数NUM_EXECUTORS_8spark.executor.instances: 8; spark.dynamicAllocation.maxExecutors: 8
エグゼキュータ数NUM_EXECUTORS_16spark.executor.instances: 16; spark.dynamicAllocation.maxExecutors: 16
エグゼキュータ数NUM_EXECUTORS_32spark.executor.instances: 32; spark.dynamicAllocation.maxExecutors: 32
エグゼキュータ数NUM_EXECUTORS_64spark.executor.instances: 64; spark.dynamicAllocation.maxExecutors: 64
エグゼキュータ数NUM_EXECUTORS_128spark.executor.instances: 128; spark.dynamicAllocation.maxExecutors: 128
エグゼキュータ数NUM_EXECUTORS_256spark.executor.instances: 256; spark.dynamicAllocation.maxExecutors: 256
エグゼキュータ数NUM_EXECUTORS_512spark.executor.instances: 512; spark.dynamicAllocation.maxExecutors: 512
タスクCPU数TASK_CPUS_2spark.task.cpus: 2
タスクCPU数TASK_CPUS_4spark.task.cpus: 4
動的割り当てDYNAMIC_ALLOCATION_DISABLEDspark.dynamicAllocation.enabled: false
動的割り当てDYNAMIC_ALLOCATION_ENABLEDspark.dynamicAllocation.enabled: true
動的割り当てDYNAMIC_ALLOCATION_MIN_2spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.minExecutors: 2
動的割り当てDYNAMIC_ALLOCATION_MIN_4spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.minExecutors: 4
動的割り当てDYNAMIC_ALLOCATION_MIN_8spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.minExecutors: 8
動的割り当てDYNAMIC_ALLOCATION_MIN_16spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.minExecutors: 16
動的割り当てDYNAMIC_ALLOCATION_MAX_8spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.maxExecutors: 8
動的割り当てDYNAMIC_ALLOCATION_MAX_16spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.maxExecutors: 16
動的割り当てDYNAMIC_ALLOCATION_MAX_32spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.maxExecutors: 32
動的割り当てDYNAMIC_ALLOCATION_MAX_64spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.maxExecutors: 64
動的割り当てDYNAMIC_ALLOCATION_MAX_128`spark.dynamicAllocation.enabled: true;