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.logでOutOfMemoryErrorを見つけた場合は、標準的な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サーバーのヒープ・サイズにも影響を与えます。