Spark の設定 - Amazon EMR

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Spark の設定

設定することができますSpark on Amazon EMR構成分類を使用する。設定分類の使用方法の詳細については「アプリケーションの設定」を参照してください。

Amazon EMR の Spark の設定分類には次が含まれます。

  • spark— を設定します。maximizeResourceAllocationプロパティを true または false に設定します。true の場合、Amazon EMR は自動的に設定します。spark-defaultsクラスターハードウェア設定に基づくプロパティ。詳細については、「」を参照してくださいmaximizeResourceAllocation を使用する

  • spark-defaults— ので値を設定します。spark-defaults.confファイルを開きます。詳細については、「」を参照してください。Spark の設定Spark のドキュメントを参照してください。

  • spark-env— ので値を設定します。spark-env.shファイルを開きます。詳細については、「」を参照してください。環境変数Spark のドキュメントを参照してください。

  • spark-hive-site— ので値を設定します。hive-site.xmlSpark

  • spark-log4j— ので値を設定します。log4j.propertiesファイルを開きます。設定と詳細については Github の log4j.properties.template ファイルをご覧ください。

  • spark-metrics— ので値を設定します。metrics.propertiesファイルを開きます。設定と詳細については Github の metrics.properties.template ファイルと Spark ドキュメントの Metrics をご覧ください。

注記

Spark ワークロードを別のプラットフォームから Amazon EMR に移行する場合は、でワークロードをテストすることをお勧めします。Amazon EMR で設定される Spark のデフォルトカスタム設定を追加する前に。ほとんどのお客様は、デフォルト設定でパフォーマンスが向上しています。

Amazon EMR で設定される Spark のデフォルト

次の表はで Amazon EMR がどのようにデフォルト値を設定するか示しています。spark-defaultsアプリケーションに影響します。

Amazon EMR で設定される Spark のデフォルト
設定 説明
spark.executor.memory エグゼキュターのプロセスごとに使用するメモリの量 (例: 1g、2g)

設定は、クラスター内のコアおよびタスクインスタンスタイプに基づいて行われます。

spark.executor.cores 各エグゼキュターに使用するコアの数。 設定は、クラスター内のコアおよびタスクインスタンスタイプに基づいて行われます。
spark.dynamicAllocation.enabled 動的なリソース割り当てを使用するかどうか。動的なリソース割り当てでは、ワークロードによって、アプリケーションで登録するエグゼキュターの数を調整します。

true (emr-4.4.0 以上)

注記

Spark Shuffle Service は Amazon EMR によって自動的に設定されます。

Amazon EMR 6.1.0 での Spark ガベージコレクションの設定

カスタムガベージコレクション構成の設定spark.driver.extraJavaOptionsおよびspark.executor.extraJavaOptionsAmazon EMR 6.1.0 とガベージコレクション設定が競合するため、Amazon EMR 6.1 でドライバまたはエグゼキューターの起動に失敗します。Amazon EMR 6.1.0 の場合、デフォルトのガベージコレクション設定はspark.driver.defaultJavaOptionsおよびspark.executor.defaultJavaOptions。この設定は Amazon EMR 6.1.0 にのみ適用されます。ロギングを設定するためのものなど、ガベージコレクションに関連しないJVMオプション (-verbose:class)、それでも設定可能extraJavaOptions。詳細については、「」を参照してください。Spark アプリケーションのプロパティ。

maximizeResourceAllocation を使用する

クラスター内の各ノードでリソース最大限に使用できるようにエグゼキュターを設定するには、maximizeResourceAllocationtrue内のspark設定分類。-maximizeResourceAllocationは Amazon EMR に固有のものです。有効にしたときmaximizeResourceAllocationでは、EMR はコアインスタンスグループのインスタンスのエグゼキューターで利用可能な最大のコンピューティングとメモリリソースを計算します。次に、対応するspark-defaults計算された最大値に基づく設定。

注記

を使用すべきではないmaximizeResourceAllocationHBase のような他の分散アプリケーションを使用するクラスターのオプション。Amazon EMR は、分散アプリケーションにカスタム YARN 設定を使用します。これは競合する可能性がありますmaximizeResourceAllocationSpark アプリケーションが失敗します。

以下は、を使用したスパーク設定の分類の例を示します。maximizeResourceAllocationに設定します。true

[ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
設定は spark-defaults で設定されます (maximizeResourceAllocation が有効になっている場合)
設定 説明
spark.default.parallelism ユーザーによって設定されていない場合に join、reduceByKey、parallelize などの変換によって返される、RDD のデフォルトパーティション数。

YARN コンテナで使用可能な CPU コアの数 (2 の倍数)。

spark.driver.memory ドライバープロセス (SparkContext が初期化されている場合) に使用するメモリの量 (例: 1g、2g)

設定は、クラスター内のスレーブインスタンスタイプに基づいて定義されます。ただし、Spark ドライバーアプリケーションは、マスターインスタンスまたはいずれかのコアインスタンスで (たとえば、YARN クライアントモードとクラスターモードのそれぞれで) 実行されるため、この設定は、これらの 2 つのインスタンスグループ間で、小さい方のインスタンスタイプに基づいて定義されます。

spark.executor.memory エグゼキュターのプロセスごとに使用するメモリの量 (例: 1g、2g)

設定は、クラスター内のコアおよびタスクインスタンスタイプに基づいて行われます。

spark.executor.cores 各エグゼキュターに使用するコアの数。 設定は、クラスター内のコアおよびタスクインスタンスタイプに基づいて行われます。
spark.executor.instances エグゼキュターの数。

設定は、クラスター内のコアおよびタスクインスタンスタイプに基づいて行われます。同時に spark.dynamicAllocation.enabled が明示的に true に設定されていない限り設定されます。

エグゼキュータの動的割り当ての有効化

YARN の Spark は、Spark アプリケーションに使用されるエグゼキュターの数を動的に増減することができます。Amazon EMR リリースバージョン 4.0 以降のバージョンでは、動的割り当てがデフォルトで有効になっています。詳細については、「」を参照してください。動的リソース割り当ておよびのプロパティ動的割り当てSpark のドキュメントを参照してください。

ノードの使用停止動作の設定

Amazon EMR リリースバージョン 5.9.0 以降を使用する場合、Amazon EMR の Spark には、手動によるサイズ変更や自動のスケーリングポリシーの要求によるノードの停止を、Spark が適切に処理できるようにするための、機能のセットが含まれています。Amazon EMR は Spark にブラックリストメカニズムを実装しています。これは YARN の停止メカニズム上の構築されています。このメカニズムにより、停止中のノードで新しいタスクがスケジュールされないようにし、同時に、既に実行中のタスクを完了するようにします。さらに、ノードの終了時にシャッフルブロックが失われた場合に、Spark のジョブを迅速に回復するための機能があります。再計算プロセスはすぐに実行され、より少ないステージの再試行でより迅速に再計算を行うように最適化されます。シャッフルブロックが見つからないことにより発生するフェッチのエラーによるジョブの失敗を避けることができます。

重要

-spark.decommissioning.timeout.thresholdAmazon EMR リリースバージョン 5.11.0 に設定が追加され、スポットインスタンスを使用する場合の Spark の耐障害性が向上しました。これまでのリリースバージョンでは、ノードがスポットインスタンスを使用していて、インスタンスが入札価格のために終了した場合、Spark は終了を適切に処理できない場合があります。ジョブが失敗する場合があり、シャッフルの再計算に長い時間がかかる場合があります。このため、スポットインスタンスを使用する場合は、リリースバージョン 5.11.0 以降を使用することをお勧めします。

Spark ノードの使用停止設定
設定 説明 デフォルト値

spark.blacklist.decommissioning.enabled

true に設定すると、Spark は、YARN で decommissioning 状態にあるノードのブラックリストを作成します。Spark はそのノードで実行されるエグゼキュターに新しいタスクをスケジュールしません。既に実行中のタスクは完了することができます。

true

spark.blacklist.decommissioning.timeout

ノードが decommissioning 状態にある時間がブラックリストに載せられます。デフォルトではこの値は 1 時間に設定されています。これは yarn.resourcemanager.decommissioning.timeout のデフォルトと同じです。ノードが停止期間全体にわたってブラックリストに載せられるようにするには、この値を yarn.resourcemanager.decommissioning.timeout 以上に設定します。停止のタイムアウトの期限が切れた後、ノードはdecommissioned状態になり、Amazon EMR はノードの EC2 インスタンスを終了できます。タイムアウトの期限が切れた後も実行しているタスクがある場合、それらのタスクは失われるか、または強制終了され、他のノードで実行されているエグゼキュターで再スケジュールされます。

1h

spark.decommissioning.timeout.threshold

Amazon EMR リリースバージョン 5.11.0 以降で使用できます。指定は秒単位です。ノードを廃棄状態に移行する際、ホストがこの値以下の使用停止時間内に廃棄される場合、Amazon EMR はノードをブラックリストに載せるだけではなく、ホストの状態をクリーンアップ (の指定による) します。spark.resourceManager.cleanupExpiredHost) ノードが廃止状態に移行するのを待たずに。これにより、スポットインスタンスが yarn.resourcemager.decommissioning.timeout の値にかかわらず 20 秒以内にタイムアウトするため、Spark がスポットインスタンスの終了をより良く処理できます。ただし、他のノードがシャッフルファイルを読み取るための時間が足りない場合があります。

20s

spark.resourceManager.cleanupExpiredHost

true に設定すると、Spark は、decommissioned 状態にあるノードのエグゼキュターに保存されているすべてのキャッシュデータとシャッフルブロックの登録を解除します。これにより、復旧プロセスが高速化されます。

true

spark.stage.attempt.ignoreOnDecommissionFetchFailure

true に設定すると、Spark でのステージの失敗と、停止ノードでの多数のフェッチの失敗によるジョブの失敗を回避できます。decommissioned 状態にあるノードのシャッフルブロックのフェッチの失敗は、連続するフェッチのエラーの最大数にカウントされません。

true

Spark ThriftServer 環境変数

Spark では、Hive Thrift Server Port 環境変数である HIVE_SERVER2_THRIFT_PORT が 10001 に設定されます。

Spark のデフォルト設定の変更

spark-defaults 設定分類を使用して、spark-defaults.conf 内のデフォルトを変更するか、spark 設定分類の maximizeResourceAllocation 設定を使用します。

次の手順では、CLI またはコンソールを使用して設定を変更する方法を示します。

CLI を使用して、spark.executor.memory が 2g に設定されたクラスターを作成するには

  • Spark がインストールされたクラスターを作成し、spark.executor.memoryファイルを参照する次のコマンドを使用して、2g に設定します。myConfig.jsonAmazon S3 に保存されています。

    aws emr create-cluster --release-label emr-5.33.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    注記

    読みやすくするために Linux 行継続文字 (\) が含まれています。これらは Linux コマンドで削除したり、使用できます。Windows の場合、それらを削除するか、キャレット (^) に置き換えます。

    myConfig.json:

    [ { "Classification": "spark-defaults", "Properties": { "spark.executor.memory": "2G" } } ]

コンソールを使用して、spark.executor.memory が 2g に設定されたクラスターを作成するには

  1. で Amazon EMR コンソールを開きます。https://console.aws.amazon.com/elasticmapreduce/

  2. [Create cluster (クラスターの作成)]、[Go to advanced options (詳細オプションに移動する)] の順に選択します。

  3. [Spark] を選択します。

  4. [Edit software settings] (ソフトウェア設定の編集) で、[Enter configuration] (設定の入力) を選択したままにしておき、次の設定を入力します。

    classification=spark-defaults,properties=[spark.executor.memory=2G]
  5. 他のオプションを選択し、[] を選択して、[Create cluster] (クラスターの作成) を選択します。

maximizeResourceAllocation を設定するには

  • Spark がインストールされたクラスターを作成し、maximizeResourceAllocationを使用して true に設定します。AWS CLIファイルを参照して、myConfig.json、Amazon S3 に保存されます。

    aws emr create-cluster --release-label emr-5.33.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    注記

    読みやすくするために Linux 行継続文字 (\) が含まれています。これらは Linux コマンドで削除したり、使用できます。Windows の場合、それらを削除するか、キャレット (^) に置き換えます。

    myConfig.json:

    [ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
注記

Amazon EMR バージョン 5.21.0 以降では、実行中のクラスター内のインスタンスグループごとに、クラスター設定を上書きして追加の設定分類を指定できます。これを行うには、Amazon EMR コンソールを使用します。AWS Command Line Interface(AWS CLI)、またはAWSSDK。詳細については、「」を参照してください。実行中のクラスター内のインスタンスグループの設定を指定する