Spark の設定 - Amazon EMR

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

Spark の設定

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

Amazon での Spark の設定分類EMRには、以下が含まれます。

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

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

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

  • spark-hive-site - Spark の hive-site.xml に値を設定します。

  • spark-log4j – (Amazon EMRリリース 6.7.x 以前) log4j.properties ファイルの値を設定します。詳細については Github の log4j.properties.template ファイルをご覧ください。

  • spark-log4j2 – (Amazon EMRリリース 6.8.0 以降) log4j2.properties ファイルの値を設定します。詳細については、Github の log4j2.properties.template ファイルをご覧ください。

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

注記

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

Amazon によって設定された Spark のデフォルト EMR

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

Amazon によって設定された Spark のデフォルト EMR
設定 説明 デフォルト値
spark.executor.memory

エグゼキュタープロセスごとに使用するメモリ量。例: 1g2g

この設定は、クラスター内のコアインスタンスタイプとタスクインスタンスタイプによって決まります。

spark.executor.cores

各エグゼキュターに使用するコアの数。

この設定は、クラスター内のコアインスタンスタイプとタスクインスタンスタイプによって決まります。

spark.dynamicAllocation.enabled

true の場合、動的なリソース割り当てを使用して、ワークロードによって、アプリケーションで登録するエグゼキュターの数を調整します。

true (Amazon EMR 4.4.0 以降を使用)

注記

Spark シャッフルサービスは Amazon EMR によって自動的に設定されます。

spark.sql.hive.advancedPartitionPredicatePushdown.enabled

true の場合、Hive メタストアへの高度なパーティション述語プッシュダウンが有効になります。

true
spark.sql.hive.stringLikePartitionPredicatePushdown.enabled

startsWithcontains、および endsWith フィルターを Hive メタストアにプッシュダウンします。

注記

Glue は startsWithcontains、または endsWith の述語プッシュダウンをサポートしていません。Glue メタストアを使用していて、これらの関数の述語プッシュダウンが原因でエラーが発生した場合は、この設定を false にしてください。

true

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

spark.driver.extraJavaOptions と でカスタムガベージコレクション設定を設定するとspark.executor.extraJavaOptions、Amazon 6.1.0 EMR とガベージコレクション設定が競合するため、ドライバーまたはエグゼキュターの起動が Amazon 6.1 EMR で失敗します。Amazon EMR6.1.0 の場合、デフォルトのガベージコレクション設定は spark.driver.defaultJavaOptionsおよび を通じて設定されますspark.executor.defaultJavaOptions。この設定は Amazon 6.1.0 EMR にのみ適用されます。JVM ログ記録 (-verbose:class) を設定するためのオプションなど、ガベージコレクションに関連しないオプションは、引き続き を通じて設定できますextraJavaOptions。詳細については、「Spark application properties」を参照してください。

maximizeResourceAllocation の使用

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

Amazon は、コアインスタンスフリートのインスタンスタイプに基づいて、エグゼキュターで使用できる最大コンピューティングリソースとメモリリソースをEMR計算します。各インスタンスフリートはフリート内で異なるインスタンスタイプとサイズを持つことができるため、Amazon がEMR使用するエグゼキュター設定はクラスターにとって最適ではない可能性があるため、最大リソース割り当てを使用するときはデフォルト設定を使用することはお勧めしません。インスタンスフリートクラスターのカスタム設定を設定します。

注記

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

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

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

YARN コンテナで使用できるCPUコアの数は 2Xです。

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

重要

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

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

spark.blacklist.decommissioning.enabled

に設定するとtrue、Spark 拒否は decommissioningの状態のノードを一覧表示しますYARN。Spark はそのノードで実行されるエグゼキュターに新しいタスクをスケジュールしません。既に実行中のタスクは完了することができます。

true

spark.blacklist.decommissioning.timeout

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

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または コンソールを使用して設定を変更する方法を示しています。

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

    aws emr create-cluster --release-label emr-7.3.0 --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/amzn-s3-demo-bucket/myfolder/myConfig.json
    注記

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

    myConfig.json:

    [ { "Classification": "spark-defaults", "Properties": { "spark.executor.memory": "2G" } } ]
コンソールを使用して、spark.executor.memory が 2g に設定されたクラスターを作成する
  1. 新しい Amazon EMRコンソールに移動し、サイドナビゲーションから古いコンソールに切り替えるを選択します。古いコンソールに切り替えたときの動作の詳細については、「Using the old console」を参照してください。

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

    aws emr create-cluster --release-label emr-7.3.0 --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/amzn-s3-demo-bucket/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 Spark リリース 3.2.x 以前のリリースでは、レガシー Apache Log4j 1.x とその log4j.properties ファイルを使用して Spark プロセスで Log4j を設定します。Apache Spark リリース 3.3.0 以降のリリースでは、Apache Log4j 2.x とその log4j2.properties ファイルを使用して Spark プロセスで Log4j を設定します。

6.8.0 未満の Amazon EMRリリースを使用して Apache Spark Log4j を設定した場合は、Amazon 6.8.0 EMR 以降にアップグレードする前に、レガシーspark-log4j設定分類を削除し、spark-log4j2設定分類とキー形式に移行する必要があります。レガシーspark-log4j分類では、Amazon EMRリリース 6.8.0 以降でクラスターの作成が失敗し、ValidationExceptionエラーが発生します。Log4j の非互換性に関連する障害については課金されませんが、続行するには無効になっている spark-log4j 設定分類を削除する必要があります。

Apache Log4j 1.x から Log4j 2.x への移行に関する詳細は、Github の「Apache Log4j Migration Guide」と「Spark Log4j 2 Template」を参照してください。

注記

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