データ接続と統合パイプラインの最適化とデバッグSparkSpark プロファイルのリファレンス

注: 以下の翻訳の正確性は検証されていません。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.enabled、spark.dynamicAllocation.minExecutors、spark.dynamicAllocation.maxExecutors の値を設定します。

この設定は、固定数ではなくエグゼキューター数の範囲を指定することで、ジョブの実行に要求するエグゼキューター数を制御します。Spark は、要求するエグゼキューター数を maxExecutors まで増やし、不要になったエグゼキューターを解放します。これは、必要なエグゼキューター数が常に一定ではない場合や、場合によっては起動時間を短縮する際に役立つことがあります。モジュールが要求した maxExecutors の数のエグゼキューターを受け取れる保証はありません。また、エグゼキューター数が変動するため、実行ごとにパフォーマンスが異なる場合があります。

実際には、動的割り当ての利点と欠点を十分に理解したうえで、大規模なジョブでのみこの設定をオーバーライドする必要があります。

適応型クエリ実行

このファミリーのプロファイルは、適応型クエリ実行(AQE)を有効または無効にします。

AQE を有効にすると、Spark は実行時にパーティション数を自動的に設定し、ビルドが高速化される可能性があります。これにより、パーティション数が少なすぎて並列性が不足することや、小さなパーティションが多すぎてオーバーヘッドが過剰になることを回避します。

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

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

処理負荷の高い UDF などにより、合計出力は小さくても計算に非常に時間がかかる場合は、AQE を無効にすることを検討してください。この場合、AQE によって並列性が低下し、計算が遅くなる可能性があります。

タスクあたりのコア数

これらのプロファイルは、spark.task.cpus の値を設定します。これらは「その他」のプロファイルファミリーに属します。

この値は、各タスクに割り当てるコア数を制御します。実際には、この値をオーバーライドする必要はほとんどありません。ジョブの並列性を制御したい場合は、代わりにエグゼキューターのコア数を確認してください。

Arrow

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

Pandas データフレームを指定して spark.createDataFrame() を呼び出す場合や、toPandas() を呼び出す場合、Spark はすべての行をシリアライズして、 一方の形式からもう一方の形式に変換する必要があります。大規模なデータフレームでは、この処理は遅く、トランスフォームの ボトルネックになる可能性があります。Pandas トランスフォームを使用する場合、このシリアライズはデータの読み取り時と書き込み時の両方で行われます。

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

Kubernetes

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

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

KUBERNETES_OPEN_PORTS_ALL プロファイルは、Spark エグゼキューター間のネットワーク通信を有効にします。これは、分散モデル学習に必要です。

列の統計情報

このプロファイルは、min、max、mean の値を含む列ごとの統計情報の計算を有効にします。このプロファイルはデフォルトで false に設定されています。つまり、列ごとの null 件数と、行数などのデータセットレベルのメトリクスのみが計算されます。

プロファイルテーブル

プロファイルファミリープロファイル名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_EXTRA_SMALLspark.executor.memory: 1536m; spark.executor.memoryOverhead: 384m
エグゼキューターメモリー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
動的割り当て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_128spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.maxExecutors: 128
動的割り当てDYNAMIC_ALLOCATION_ENABLED_1_2spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.minExecutors: 1; spark.dynamicAllocation.maxExecutors: 2
動的割り当てDYNAMIC_ALLOCATION_ENABLED_2_4spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.minExecutors: 2; spark.dynamicAllocation.maxExecutors: 4
動的割り当てDYNAMIC_ALLOCATION_ENABLED_4_8spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.minExecutors: 4; spark.dynamicAllocation.maxExecutors: 8
動的割り当てDYNAMIC_ALLOCATION_ENABLED_8_16spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.minExecutors: 8; spark.dynamicAllocation.maxExecutors: 16
動的割り当てDYNAMIC_ALLOCATION_ENABLED_16_32spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.minExecutors: 16; spark.dynamicAllocation.maxExecutors: 32
動的割り当てDYNAMIC_ALLOCATION_ENABLED_32_64spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.minExecutors: 32; spark.dynamicAllocation.maxExecutors: 64
動的割り当てDYNAMIC_ALLOCATION_ENABLED_64_128spark.dynamicAllocation.enabled: true; spark.dynamicAllocation.minExecutors: 64; spark.dynamicAllocation.maxExecutors: 128
動的割り当てDYNAMIC_ALLOCATION_FAST_SCALE_DOWNspark.dynamicAllocation.executorIdleTimeout: 10s
動的割り当てDYNAMIC_ALLOCATION_SLOW_SCALE_UP_2Mspark.dynamicAllocation.schedulerBacklogTimeout: 2m
シャッフルパーティションSHUFFLE_PARTITIONS_SMALLspark.sql.shuffle.partitions: 20
シャッフルパーティションSHUFFLE_PARTITIONS_MEDIUMspark.sql.shuffle.partitions: 200
シャッフルパーティションSHUFFLE_PARTITIONS_LARGEspark.sql.shuffle.partitions: 2000
シャッフルパーティションSHUFFLE_PARTITIONS_EXTRA_LARGEspark.sql.shuffle.partitions: 20000
適応型クエリ実行ADAPTIVE_DISABLEDspark.sql.adaptive.enabled: false
適応型クエリ実行ADAPTIVE_ENABLEDspark.sql.adaptive.enabled: true
適応型クエリ実行ADVISORY_PARTITION_SIZE_MEDIUMspark.sql.adaptive.enabled: true; spark.sql.adaptive.advisoryPartitionSizeInBytes: 128MB; spark.sql.adaptive.shuffle.targetPostShuffleInputSize: 128MB
適応型クエリ実行ADVISORY_PARTITION_SIZE_LARGEspark.sql.adaptive.enabled: true; spark.sql.adaptive.advisoryPartitionSizeInBytes: 256MB; spark.sql.adaptive.shuffle.targetPostShuffleInputSize: 256MB
RPC メッセージサイズRPC_MESSAGE_MAX_SIZE_512Mspark.rpc.message.maxSize: 512
RPC メッセージサイズRPC_MESSAGE_MAX_SIZE_1Gspark.rpc.message.maxSize: 1024
RPC メッセージサイズRPC_MESSAGE_MAX_SIZE_MAXspark.rpc.message.maxSize: 2047
レガシーLEGACY_ALLOW_UNTYPED_SCALA_UDFspark.sql.legacy.allowUntypedScalaUDF: true
レガシーLEGACY_ALLOW_NEGATIVE_DECIMAL_SCALEspark.sql.legacy.allowNegativeScaleOfDecimal: true
レガシーLEGACY_ALLOW_HASH_ON_MAPTYPEspark.sql.legacy.allowHashOnMapType: true
レガシーLEGACY_NAME_NON_STRUCT_GROUPING_KEY_AS_VALUEspark.sql.legacy.dataset.nameNonStructGroupingKeyAsValue: true
レガシーLEGACY_ARRAY_EXISTS_NULL_HANDLINGspark.sql.legacy.followThreeValuedLogicInArrayExists: false
レガシーLEGACY_ALLOW_AMBIGUOUS_SELF_JOINspark.sql.analyzer.failAmbiguousSelfJoin: false
レガシーLEGACY_TIME_PARSER_POLICYspark.sql.legacy.timeParserPolicy: LEGACY
レガシーLEGACY_DATETIME_REBASE_MODEspark.sql.legacy.avro.datetimeRebaseModeInRead: LEGACY; spark.sql.legacy.parquet.datetimeRebaseModeInRead: LEGACY; spark.sql.legacy.avro.datetimeRebaseModeInWrite: LEGACY; spark.sql.legacy.parquet.datetimeRebaseModeInWrite: LEGACY
レガシーLEGACY_FROM_DAYTIME_STRINGspark.sql.legacy.fromDayTimeString.enabled: true
レガシーLEGACY_DATETIME_STRING_COMPARISONspark.sql.legacy.typeCoercion.datetimeToString.enabled: true
日付と時刻TIME_PARSER_POLICY_CORRECTEDspark.sql.legacy.timeParserPolicy: CORRECTED
日付と時刻SPARK_ALLOW_INT96_AS_TIMESTAMPspark.sql.parquet.int96AsTimestamp: true
その他BUCKET_SORTED_SCAN_ENABLEDspark.sql.sources.bucketing.sortedScan.enabled: true
その他LAST_MAP_KEY_WINSspark.sql.mapKeyDedupPolicy: LAST_WIN
その他CROSS_JOIN_ENABLEDspark.sql.crossJoin.enabled: true
その他SPECULATIVE_EXECUTIONspark.speculation: true; spark.speculation.interval: 1s; spark.speculation.multiplier: 4.0; spark.speculation.quantile: 0.9
その他AUTO_BROADCAST_JOIN_DISABLEDspark.sql.autoBroadcastJoinThreshold: -1
その他ALLOW_ADD_MONTHSspark.foundry.sql.allowAddMonths: true
その他TASK_CPUS_2spark.task.cpus: 2
その他TASK_CPUS_4spark.task.cpus: 4
その他PYSPARK_ROW_FIELD_SORTING_ENABLEDspark.executorEnv.PYSPARK_ROW_FIELD_SORTING_ENABLED: true; spark.yarn.appMasterEnv.PYSPARK_ROW_FIELD_SORTING_ENABLED: true; spark.kubernetes.driverEnv.PYSPARK_ROW_FIELD_SORTING_ENABLED: true
その他PYSPARK_ROW_FIELD_SORTING_DISABLEDspark.executorEnv.PYSPARK_ROW_FIELD_SORTING_ENABLED: false; spark.yarn.appMasterEnv.PYSPARK_ROW_FIELD_SORTING_ENABLED: false; spark.kubernetes.driverEnv.PYSPARK_ROW_FIELD_SORTING_ENABLED: false
その他PYSPARK_ROW_SCHEMA_CORRUPTION_CHECK_DISABLEDspark.kubernetes.driverEnv.PYSPARK_CHECK_ROW_SCHEMA_CORRUPTION: false; spark.yarn.appMasterEnv.PYSPARK_CHECK_ROW_SCHEMA_CORRUPTION: false; spark.executorEnv.PYSPARK_CHECK_ROW_SCHEMA_CORRUPTION: false
その他SPARK_KYRO_REFERENCE_TRACKING_DISABLEDspark.kryo.referenceTracking: false
その他GEOSPARKspark.foundry.build.stats.enabled: false
その他SPARK_REFERENCE_TRACKING_DISABLEDspark.cleaner.referenceTracking: false
その他ENABLE_COLUMN_STATSspark.foundry.build.stats.enableColumnStats: false
その他MANAGED_PROFILE過去のジョブメトリクスに基づくプロファイルの自動最適化を有効にします
ArrowARROW_ENABLEDspark.sql.execution.arrow.enabled: true; spark.sql.execution.arrow.pyspark.enabled: true; spark.sql.execution.arrow.sparkr.enabled: true; spark.sql.execution.arrow.fallback.enabled: true; spark.sql.execution.arrow.pyspark.fallback.enabled: true
ArrowARROW_DISABLEDspark.sql.execution.arrow.enabled: false; spark.sql.execution.arrow.pyspark.enabled: false; spark.sql.execution.arrow.sparkr.enabled: false
KubernetesKUBERNETES_CPU_ARCHITECTURE_OVERRIDE_AMD64N/A
KubernetesKUBERNETES_CPU_ARCHITECTURE_OVERRIDE_ARM64N/A
Kubernetes の開放ポートKUBERNETES_OPEN_PORTS_ALL分散モデルトレーニング用に Spark エグゼキューター間のネットワーク通信を有効にします
ローカル SparkKUBERNETES_NO_EXECUTORS_SMALLspark.kubernetes.local.submission: true; spark.sql.shuffle.partitions: 1; spark.kubernetes.driver.request.cores: 400m; spark.driver.cores: 1; spark.driver.memory: 3g; spark.driver.memoryOverhead: 768m