Spark JVMおよびメモリーの管理

DataStax Enterpriseで実行中のSparkジョブは、複数の異なるJVMプロセス間で分割されます。

cassandra-env.sh

cassandra-env.shファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/cassandra-env.sh
tarボール・インストール installation_location/resources/cassandra/conf/cassandra-env.sh

spark-env.sh

spark-env.shファイルのデフォルトの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/spark/spark-env.sh
tarボール・インストール installation_location/resources/spark/conf/spark-env.sh

dse.yaml

dse.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/dse.yaml
tarボール・インストール installation_location/resources/dse/conf/dse.yaml

DataStax Enterpriseで実行中のSparkジョブは、複数の異なるJVMプロセス間で分割され、それぞれのメモリー要件が異なります。

DataStax EnterpriseとSparkマスターJVM

Sparkマスターは、DataStax Enterpriseと同じプロセスで実行されますが、そのメモリー使用量はごくわずかです。DataStax EnterpriseでSparkによってOutOfMemoryErrorが発生する可能性があるのは、間接的には、クライアント要求キューを満たすクエリーを実行した場合のみです。たとえば、制限値が高いクエリーが実行されて、ページングが無効になっている場合や、データを更新またはテーブルに挿入するために非常に大きなバッチが使用された場合です。これは、cassandra-env.sh内のMAX_HEAP_SIZEで制御します。system.logOutOfMemoryErrorを見つけた場合は、標準的なOutOfMemoryErrorとして処理し、通常のトラブルシューティング手順に従います。

SparkエグゼキューターJVM

Sparkエグゼキューターでは、SparkがRDDに対して変換とアクションを実行し、通常は、Spark関連のOutOfMemoryErrorが生じます。エグゼキューターのOutOfMemoryErrorは、現在実行中のアプリケーションのstderrログに示されます(通常は/var/lib/spark)。エグゼキューターのメモリーを制御する複数の構成設定が存在し、複雑な方法で対話します。

  • dse.yaml 内のresource_manager_options.worker_optionsセクションのmemory_totalオプションは、特定のノードで実行しているすべてのアプリケーションについてすべてのエグゼキューターを指定するための、システム・メモリーに対する最大の割合を定義します。以下の公式が使用されます。

    memory_total * (total system memory - memory assigned to DataStax Enterprise)

  • spark.executor.memoryは、特定のアプリケーションによって取得されるエグゼキューターのメモリー量を制御するシステム・プロパティです。これは、計算されたmemory_totalの値以下でなければなりません。ドライバー・アプリケーションのSparkContextのコンストラクターか、spark-submitを使用してジョブを送信する場合は、--conf spark.executor.memoryまたは--executor-memoryコマンドラインで指定されます。

クライアント・ドライバーJVM

ドライバーは、Sparkジョブのクライアント・プログラムです。通常、ほとんどのデータがエグゼキューター内で処理されるため、必要なメモリーの量はそれほど多くなりません。数ギガバイト以上が必要な場合、ご使用のアプリケーションでは、collectまたはtakeを使用して、ローカル・データ構造にRDDのすべてのデータを入れるなどのアンチパターンを使用する場合があります。一般に、プロダクション・コードでcollectを使用することはなく、takeを使用しても、ごくわずかなレコードしか取得されません。ドライバーでメモリーが使い果たされると、ドライバーstderrまたはログに構成されている場所でOutOfMemoryErrorが生じます。これは以下の2つの場所で制御されます。

  • SPARK_DRIVER_MEMORY spark-env.sh
  • --conf spark.driver.memoryまたは--driver-memoryコマンドライン・オプションによって指定できるspark.driver.memoryシステム・プロパティ(spark-submitを使用してジョブを送信する場合)。これは、その時点でドライバーが既に起動されているため、SparkContextコンストラクターでは指定できません

SparkのワーカーのJVM

ワーカーは、エグゼキューターを生成するウォッチドッグ・プロセスであるため、ヒープ・サイズを大きくする必要はありません。ワーカーのヒープ・サイズは、spark-env.sh内のSPARK_DAEMON_MEMORYで制御されます。また、SPARK_DAEMON_MEMORYは、Spark SQL Thriftサーバーのヒープ・サイズにも影響を与えます。