Spark JVMとメモリーの管理
DataStax Enterpriseで実行中のSparkジョブは、複数の異なるJVMプロセス間で分割されます。
DataStax Enterpriseで実行中のSparkジョブは、複数の異なるJVMプロセス間で分割され、それぞれのメモリー要件が異なります。
DataStax EnterpriseとSparkマスターJVM
Sparkマスターは、DataStax Enterpriseと同じプロセスで実行されますが、そのメモリー使用量はごくわずかです。DataStax EnterpriseでSparkによってOutOfMemoryErrorが発生する可能性があるのは、間接的には、クライアント要求キューを満たすクエリーを実行した場合のみです。たとえば、制限値が高いクエリーが実行されて、ページングが無効になっている場合や、データを更新またはテーブルに挿入するために非常に大きなバッチが使用された場合です。これは、cassandra-env.shのMAX_HEAP_SIZE
で制御します。system.logでOutOfMemoryErrorを見つけた場合は、標準的なOutOfMemoryErrorとして処理し、通常のトラブルシューティング手順に従います。
SparkエグゼキューターJVM
Sparkエグゼキューターでは、SparkがRDDに対して変換とアクションを実行し、通常は、Spark関連のOutOfMemoryErrorが生じます。エグゼキューターのOutOfMemoryErrorは、現在実行中のアプリケーションのstderr
ログに示されます(通常は/var/lib/spark)。エグゼキューターのメモリーを制御する複数の構成設定が存在し、複雑な方法で対話します。
- spark-env.shの
SPARK_WORKER_MEMORY
は、特定のノードで実行しているすべてのアプリケーションについてすべてのエグゼキューターを指定するための最大メモリー量です。 - dse.yamlの
initial_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
コマンドラインで指定されます。
パッケージ・インストールInstaller-Servicesインストール |
/etc/dse/spark/spark-env.sh |
tarボール・インストールInstaller-No Servicesインストール |
installation_location/resources/spark/conf/spark-env.sh |
パッケージ・インストールInstaller-Servicesインストール |
/etc/dse/dse.yaml |
tarボール・インストールInstaller-No Servicesインストール |
installation_location/resources/dse/conf/dse.yaml |
パッケージ・インストール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.shの
SPARK_DRIVER_MEMORY
。 - の
SPARK_DRIVER_MEMORY
--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サーバーのヒープ・サイズにも影響を与えます。