Spark JVMとメモリーの管理

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

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

DataStax EnterpriseとSparkマスターJVM

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

SparkエグゼキューターJVM

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

  • spark-env.shSPARK_WORKER_MEMORYは、特定のノードで実行しているすべてのアプリケーションについてすべてのエグゼキューターを指定するための最大メモリー量です。
  • dse.yamlinitial_spark_worker_resourcesは、SPARK_WORKER_MEMORYがコメントアウトされている場合(デフォルト)に自動的に計算するために使用されます。以下の公式が使用されます。

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

  • spark.executor.memoryは、特定のアプリケーションによって取得されるエグゼキューターのメモリー量を制御するシステム・プロパティです。これはSPARK_WORKER_MEMORY以下である必要があります。ドライバー・アプリケーションのSparkContextのコンストラクターか、spark-submitを使用してジョブを送信する場合は、--conf spark.executor.memoryまたは--executor-memoryコマンドラインで指定されます。
spark-env.shファイルのデフォルトの場所は、インストールのタイプによって異なります。

パッケージ・インストールInstaller-Servicesインストール

/etc/dse/spark/spark-env.sh

tarボール・インストールInstaller-No Servicesインストール

installation_location/resources/spark/conf/spark-env.sh
dse.yamlファイルの場所は、インストールのタイプによって異なります。

パッケージ・インストールInstaller-Servicesインストール

/etc/dse/dse.yaml

tarボール・インストールInstaller-No Servicesインストール

installation_location/resources/dse/conf/dse.yaml
cassandra-env.shファイルの場所は、インストールのタイプによって異なります。

パッケージ・インストールInstaller-Servicesインストール

/etc/dse/cassandra/cassandra-env.sh

tarボール・インストールInstaller-No Servicesインストール

installation_location/resources/cassandra/conf/cassandra-env.sh

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

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

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

SparkワーカーJVM

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