Spark の設定 - Amazon EMR

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

Spark の設定

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

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

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

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

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

  • spark-hive-site— に値を設定しますhive-site.xmlスパーク用。

  • spark-log4j— (Amazon EMR リリース 6.7.x 以前) で値を設定しますlog4j.propertiesファイル。詳細については、を参照してください。log4j.properties.templateGithub 上のファイル。

  • spark-log4j2— (Amazon EMR リリース 6.8.0 以降) 内の値を設定しますlog4j2.propertiesファイル。詳細については、を参照してください。log4j2. プロパティ.テンプレートGithub 上のファイル。

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

注記

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

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

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

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.extraJavaOptionsspark.executor.extraJavaOptions を使用してカスタムガーベッジコレクション構成を設定すると、Amazon 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 application properties」を参照してください。

使用する maximizeResourceAllocation

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

注記

HBase などの他の分散アプリケーションでは、クラスターで maximizeResourceAllocation オプションを使用しないでください。Amazon EMR は分散アプリケーションにカスタム YARN 設定を使用するため、maximizeResourceAllocation と競合し、Spark アプリケーションが失敗する可能性があります。

以下に、maximizeResourceAllocationtrue に設定された Spark 設定分類の例を示します。

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

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 に設定されていない限り設定されます。

ノード停止の動作設定

Amazon EMR リリース 5.9.0 以降を使用する場合、Amazon EMR の Spark には、手動によるサイズ変更や自動スケーリングポリシーのリクエストによるノードの終了を Spark が適切に処理できるようにする一連の機能が含まれています。Amazon EMR では、YARN の廃止メカニズムの上に構築されたリスティング拒否メカニズムが Spark に実装されています。このメカニズムにより、停止中のノードで新しいタスクがスケジュールされないようにし、同時に、既に実行中のタスクを完了するようにします。さらに、ノードの終了時にシャッフルブロックが失われた場合に、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

スパーク 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 に設定されたクラスターを作成する
  • Amazon S3 に格納されている myConfig.json ファイルを参照する次のコマンドを使用して、Spark がインストールされ、spark.executor.memory が 2g に設定されたクラスターを作成します。

    aws emr create-cluster --release-label emr-5.36.1 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --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 コンソールに移動し、以下を選択します。古いコンソールに切り替えます。サイド・ナビゲーションから。古いコンソールに切り替えた場合の注意点について詳しくは、を参照してください。古いコンソールの使用

  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
  • Amazon S3 に格納されている myConfig.json ファイルを参照して、Spark がインストールされ、maximizeResourceAllocation が true に設定されたクラスターを AWS CLI を使用して作成します。

    aws emr create-cluster --release-label emr-5.36.1 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --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)、または AWS SDK を使用します。詳細については、「実行中のクラスター内のインスタンスグループの設定を指定する」を参照してください。

Apache Log4j 1.x から Log4j 2.x への移行

Apache Spark3.2.x 以前のリリースでは、従来の Apache Log4j 1.x とlog4j.propertiesSpark プロセスで Log4j を設定するためのファイル。Apache Spark リリース 3.3.0 以降では Apache Log4j 2.x とlog4j2.propertiesSpark プロセスで Log4j を設定するためのファイル。

6.8.0 より前の Amazon EMR リリースを使用して Apache Spark Log4j を設定した場合は、レガシーを削除する必要があります。spark-log4j設定の分類とへの移行spark-log4j2Amazon EMR 6.8.0 以降にアップグレードする前の設定分類とキーフォーマット。レガシーspark-log4j分類が原因でクラスターの作成が失敗し、ValidationExceptionAmazon EMR リリース 6.8.0 以降ではエラーが発生します。Log4j の非互換性に関連する障害については課金されませんが、機能していないものは削除する必要があります。spark-log4j設定の分類を続行してください。

Apache Log4j 1.x から Log4j 2.x への移行に関する詳細については、以下を参照してください。Apache Log4j 移行ガイドスパーク Log4j 2 テンプレートGithub で。

注記

Amazon EMR では、Apache Spark はlog4j2.propertiesで説明されている.xml ファイルではなくファイルです。Apache Log4j 移行ガイド. また、Log4j 1.x ブリッジメソッドを使用して Log4j 2.x に変換することはお勧めしません。