Sparkノードの構成
Sparkノードのセキュリティ、パフォーマンス、およびロギングの設定を変更します。
cassandra-rackdc.properties
cassandra-rackdc.propertiesファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/cassandra/cassandra-rackdc.properties |
tarボール・インストール | installation_location/resources/cassandra/conf/cassandra-rackdc.properties |
spark-env.sh
spark-env.shファイルのデフォルトの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/spark/spark-env.sh |
tarボール・インストール | installation_location/resources/spark/conf/spark-env.sh |
cassandra.yaml
cassandra.yamlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/cassandra/cassandra.yaml |
tarボール・インストール | installation_location/resources/cassandra/conf/cassandra.yaml |
hive-site.xml
Sparkを使用する場合のhive-site.xmlファイルのデフォルトの場所:パッケージ・インストール | /etc/dse/spark/hive-site.xml |
tarボール・インストール | installation_location/resources/spark/conf/hive-site.xml |
spark-defaults.conf
spark-defaults.confファイルのデフォルトの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/spark/spark-defaults.conf |
tarボール・インストール | installation_location/resources/spark/conf/spark-defaults.conf |
dse.yaml
dse.yamlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/dse.yaml |
tarボール・インストール | installation_location/resources/dse/conf/dse.yaml |
Sparkノードのセキュリティ、パフォーマンス、およびロギングの設定を変更します。
環境変数を設定する
DataStaxでは、OutOfMemoryError状態が発生しているか、ガーベージ・コレクションに時間がかかりすぎているためにメモリー設定を増やす必要がない限り、Spark環境変数のデフォルト値を使用することを推奨しています。dse.yaml および spark-env.shファイルのSparkメモリ構成オプションを使用します。
DSEを起動する前にお使いの環境でALLOW_SPARK_HOME=true
も設定すると、ユーザー固有のSPARK_HOME
ディレクトリーを設定できます。
たとえば、DebianまたはUbuntuでパッケージ・インストールを使用する場合は、以下のようになります。
export SPARK_HOME=$HOME/spark && export ALLOW_SPARK_HOME=true && sudo service dse start
シャッフル・データ、RDD、およびその他の一時的なSparkデータの一時ディレクトリーは、ローカルに実行されているドライバーと、DSEによって管理されるSparkサーバー・プロセス(Sparkマスター、ワーカー、シャッフル・サービス、エグゼキューター、およびクラスター・モードで実行されているドライバー)の両方に対して構成できます。
ローカルで実行されているSparkドライバーの場合、SPARK_LOCAL_DIRS
環境変数は、ユーザー環境またはspark-env.shでカスタマイズできます。デフォルトでは、システムの一時ディレクトリーに設定されます。たとえば、Ubuntuでは/tmp/です。システム一時ディレクトリーがない場合、SPARK_LOCAL_DIRS
はユーザーのホーム・ディレクトリーの.sparkディレクトリーに設定されます。
その他のSparkサーバー・プロセスの場合、SPARK_EXECUTOR_DIRS
環境変数は、ユーザー環境またはspark-env.shでカスタマイズできます。デフォルトでは、/var/lib/spark/rddに設定されています。
SPARK_LOCAL_DIRS
およびSPARK_EXECUTOR_DIRS
環境変数値は、非DSE Sparkとは異なります。ワーカーのクリーンアップを構成するには、SPARK_WORKER_OPTS
環境変数を変更し、クリーンアップ・プロパティを追加します。SPARK_WORKER_OPTS
環境変数は、ユーザー環境または spark-env.shで設定できます。たとえば、次の構成ではワーカー・クリーンアップを有効にし、クリーンアップ間隔を30分(1800秒)に設定し、アプリケーション・ワーカー・ディレクトリーが保持される時間の長さを7日(604800秒)に設定します。
export SPARK_WORKER_OPTS="$SPARK_WORKER_OPTS \ -Dspark.worker.cleanup.enabled=true \ -Dspark.worker.cleanup.interval=1800 \ -Dspark.worker.cleanup.appDataTtl=604800"
Sparkディレクトリーを保護する
Sparkクラスターを起動すると、DataStax EnterpriseによってSparkワーカーごとにSpark作業ディレクトリーがワーカー・ノード上に作成されます。ワーカー・ノードには、spark-env.shのSPARK_WORKER_INSTANCESオプションで構成される、複数のワーカーを含めることができます。SPARK_WORKER_INSTANCESが定義されていない場合は、単一のワーカーを起動します。作業ディレクトリーには、エグゼキューターの標準出力と標準エラーをはじめ、Sparkワーカーとエグゼキューターによって格納されているアプリケーション固有のデータが含まれており、DSEユーザーしか書き込めないようになっています。
デフォルトでは、Sparkの親作業ディレクトリーは/var/lib/spark/workにあります。各ワーカーはworker-numberという名前のサブディレクトリー内にあり、その番号は0から開始します。親ワーカー・ディレクトリーを変更するには、spark-env.shファイルのSPARK_WORKER_DIRを構成します。
Spark RDDディレクトリーは、エグゼキューターがディスクに書き出すことを決めたRDDが配置されるディレクトリーです。このディレクトリーには、データベースからのデータやSparkアプリケーションの実行結果などが格納されます。ディレクトリー内のデータの機密性が高い場合は、無許可ユーザーによるアクセスを防ぐ必要があります。RDDディレクトリーには大量のデータが置かれる可能性があるため、RDDディレクトリーは高速ディスク上に配置します。このディレクトリーに書き込むことができるのはcassandra
ユーザーだけです。Spark RDDディレクトリーのデフォルトの場所は/var/lib/spark/rddです。このディレクトリーは高速ディスク上に配置する必要があります。RDDディレクトリーを変更するには、spark-env.shファイルのSPARK_EXECUTOR_DIRSを構成します。
デフォルトのSparkディレクトリーへのアクセス権を付与する
sudo mkdir -p /var/lib/spark/rdd; sudo chmod a+w /var/lib/spark/rdd; sudo chown -R $USER:$GROUP /var/lib/spark/rdd &&
sudo mkdir -p /var/log/spark; sudo chown -R $USER:$GROUP /var/log/spark
複数データ・センター・クラスターでは、仮想データ・センターを使用してSparkジョブを分離します。実行中のSparkジョブは、リソースを消費し、レイテンシーとスループットに影響する可能性があります。
DataStax Enterpriseでは、仮想ノード(vnode)とSparkの併用がサポートされます。
Sparkノードのセキュリティを確保する
- クライアントとノード間のSSL
- クライアント認証が有効になっていない場合でも、「クライアントとノード間の暗号化」で説明されているように、cassandra.yaml にトラストストア・エントリーが存在することを確認します。
- セキュリティおよび認証の有効化
- セキュリティは、dse.yamlの
spark_security_enabled
オプションを使用して有効にします。この設定をenabled
にすると、Sparkマスター・ノードとWorkerノード間の認証がオンになり、暗号化を有効にすることができます。Web UI以外のすべてのコンポーネントのSpark接続を暗号化するには、spark_security_encryption_enabled
を有効にします。Sparkコンポーネントのセキュリティ確保に使用される共有シークレットの長さは、spark_shared_secret_bit_length
オプションを使用して設定され、デフォルト値は256ビットです。これらのオプションについては、「DSE分析オプション」で説明しています。プロダクション環境クラスターの場合は、これらの認証と暗号化を有効にします。有効にしても、パフォーマンスには大きな影響を与えません。 - 認証とSparkアプリケーション
- 認証を有効にすると、ユーザーは、アプリケーションを送信するために認証される必要があります。
- 権限管理とSparkアプリケーション
- DSEの権限管理を有効にすると、ユーザーにはアプリケーションを送信するためのパーミッションが必要になります。また、アプリケーションを送信するユーザーはアプリケーションを管理するためのパーミッションを自動的に受け取り、このパーミッションを任意で他のユーザーに拡張できます。
- Spark SQL Thriftサーバーのデータベース認証情報
- hive-site.xml ファイルでSpark SQL Thriftサーバーの認証資格情報を構成します。以下のように、Sparkディレクトリーでhive-site.xmlファイルを使用します。
- パッケージ・インストール:/etc/dse/spark/hive-site.xml
- tarボール・インストール:installation_location/resources/spark/conf/hive-site.xml
- SparkでKerberosを使用する方法
- Sparkランチャーは、Kerberos認証を使用して、Kerberos認証情報でDSEに接続し、デリゲーション・トークンを生成するようにDSEに要求します。Sparkドライバーとエグゼキューターは、デリゲーション・トークンを使用してクラスターに接続します。有効な認証を行うために、デリゲーション・トークンを定期的に更新する必要があります。セキュリティ上の理由から、このトークンを使用して認証されるユーザーは、このトークンを更新することはできません。したがって、デリゲーション・トークンには、トークンの所有者とトークンの更新者の2名の関連ユーザーが存在することになります。
トークンの更新者がいない場合、トークンを更新できるのはDSE内部プロセスを通じた場合のみとなります。アプリケーションが送信されると、DSEは、Sparkアプリケーションに関連付けられているデリゲーション・トークンを自動的に更新します。アプリケーションが登録されていない(終了した)場合、デリゲーション・トークンの更新が停止し、トークンがキャンセルされます。
Sparkメモリーおよびコアを構成する
Sparkメモリー・オプションは、Sparkエコシステムのさまざまなコンポーネントに影響します。
- Spark HistoryサーバーとSpark Thriftサーバーのメモリー
- SPARK_DAEMON_MEMORYオプションは、Spark SQL Thriftサーバーと履歴サーバーによって使用されるメモリーを構成します。この設定は、これらのサーバー・アプリケーションで実行される、ノード上の spark-env.sh ファイルで追加または変更します。
- Sparkワーカーのメモリー
- dse.yamlの
resource_manager_options.worker_options
セクションのmemory_total
オプションは、特定のノード上のワーク・プールによって実行されるすべてのエグゼキューターに割り当てることができるシステム・メモリーの合計を構成します。他のワーク・プールが定義されていない場合、default
に指定されたワーク・プールがこのメモリーのすべてを使用します。追加のワーク・プールを定義する場合は、ワーク・プール定義でmemory
オプションを設定して、メモリーの合計量を設定できます。 - アプリケーション・エグゼキューターのメモリー
- アプリケーション用に消費できるメモリー容量をエグゼキューターごとに構成できます。Sparkでは、デフォルト値の512MBが使用されます。spark.executor.memoryオプション(「Sparkの使用可能なプロパティ」を参照)または
--executor-memory mem
引数をdse sparkコマンドに対して使用します。
アプリケーション・メモリー
アプリケーションのエグゼキューターを生成するときにワーカーによって適用される追加のJavaオプションを構成できます。spark.executor.extraJavaOptionsプロパティ(「Spark 1.6.2の使用可能なプロパティ」を参照)を使用します。例を次に示します。spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
コアの管理
- Sparkワーカー・コア
dse.yamlの
resource_manager_options.worker_options
セクションのcores_total
オプションは、エグゼキューターのSparkワーカーで使用可能なシステム・コアの合計数を構成します。dse.yamlのresource_manager_options.workpools
セクションでワーク・プールが定義されていない場合、default
に指定されたワーク・プールが、cores_total
で定義されたすべてのコアを使用します。追加のワーク・プールが定義されている場合、default
に指定されたワーク・プールは、ワーク・プールで定義されたコアを割り当てた後に使用可能なコアを使用します。単一のエグゼキューターがワーカーから複数のコアを借りることができます。エグゼキューターによって使用されるコアの数は、エグゼキューターによって実行される並列タスクの数と関連しています。クラスターによって提供されるコアの数は、クラスター内のすべてのワーカーによって提供されるコアの合計です。
- アプリケーション・コア
アプリケーションのSpark構成オブジェクトでは、spark.cores.max構成プロパティまたは
--total-executor-cores コア
引数をdse sparkコマンドに対して使用することによって、そのアプリケーションがクラスターから要求するアプリケーション・コアの数を構成します。
resource_manager_options.worker_options
セクションには、Sparkワーカーおよび定義済みのワーク・プール、または明示的なリソース設定で使用可能なシステム・リソースの比率を構成するためのオプションがあります。システム・リソースの小数点以下の値を指定する場合、使用可能なリソースは次の方法で計算されます。Spark Worker memory = memory_total * (total system memory - memory assigned to DSE)
Spark Worker cores = cores_total * total system cores
この計算は、小数点以下の値に使用されます。設定が指定されていない場合は、デフォルト値の0.7が使用されます。値に小数点以下の桁数が含まれていない場合、設定は、DSEによってSpark用に予約されたコア数またはメモリー容量の明示的な数値になります。
Cores_totalまたはワークプールのcoresを1.0に設定すると、
またはワークプールのcores
を1.0に設定すると10進値が生成され、これは使用可能なコアの100%が予約されることを意味します。cores_total
またはcores
を1(小数点なし)に設定すると明示的な値が生成され、1つのコアが予約されます。名前が付いたワーク・プールのメモリー容量とコア数に割り当てることができる最小値は、それぞれ64 MBと1コアです。計算結果がこれよりも低い場合、例外はスローされず、自動的に値が制限されます。
次の例は、1つのコアと512MBのRAMが割り当てられているworkpool1
という名前のワーク・プールを示しています。worker_options
の値から計算された残りのリソースは、default
のワーク・プールに割り当てられます。
resource_manager_options:
worker_options:
cores_total: 0.7
memory_total: 0.7
workpools:
- name: workpool1
cores: 1
memory: 512M
クラウド環境でのSparkクラスターの実行
Amazon EC2のようなクラウド・インフラストラクチャー・プロバイダーを使用している場合は、お使いのクラスターで公的にルーティング可能なIPアドレスに対してポートを明示的に開く必要があります。ポートを開かないと、SparkワーカーはSparkマスターを見つけることができません。
回避策の1つは、cassandra-rackdc.properties スニッチ・セットアップ・ファイルのprefer_local
設定をtrueに設定することです。
# Uncomment the following line to make this snitch prefer the internal ip when possible, as the Ec2MultiRegionSnitch does.
prefer_local=true
これにより、ルーティング可能なパブリックIPアドレスではなく、データ・センター内のプライベートIPアドレスでのみ通信するようにクラスターに通知されます。
Spark構成を取得するリトライ数の構成
SparkがDSEから構成設定をフェッチすると、構成データを取得できない場合はすぐに失敗しますが、デフォルトでは5回リトライが行われるため、リトライ間の遅延が大きくなります。リトライ数をSpark構成で設定するには、dse sparkコマンドを呼び出す際またはspark-defaults.confでspark.dse.configuration.fetch.retries
構成プロパティを変更します。
連続ページングの無効化
連続ページングでは、DSEからDSE Sparkによって使用されるDataStax Java Driverへとレコードを一括でストリーミングします。デフォルトでは、クエリー内での連続ページングが有効になっています。これを無効にするには、Spark SQLシェルを起動する際または spark-defaults.confでspark.dse.continuous_paging_enabled
設定をfalseに設定します。例を次に示します。
dse spark-sql --conf spark.dse.continuous_paging_enabled=false
Spark Webインターフェイス・ポートの構成
デフォルトでは、Spark Web UIはポート7080で実行されます。ポート番号を変更するには、次の操作を行います。
- テキスト・エディターで spark-env.sh ファイルを開きます。
SPARK_MASTER_WEBUI_PORT
変数を新しいポート番号に設定します。たとえば、ポート7082に設定するには、次のようにします。export SPARK_MASTER_WEBUI_PORT=7082
- クラスター内のAnalyticsノードごとに以上の手順を繰り返します。
- クラスター内のノードを再起動します。
DSE SparkでのGraphiteメトリクスの有効化
サードパーティJARは、各ノードのSpark libディレクトリーに追加して、クラスターを再起動することで、Sparkノードに追加できます。このディレクトリーにGraphiteメトリクスJARを追加して、DSE Sparkでメトリクスを有効にします。
- パッケージ・インストール:/usr/share/dse/spark/lib
- tarボール・インストール:/var/lib/spark
cp metrics-graphite-3.1.2.jar /usr/share/dse/spark/lib/ && cp metrics-json-3.1.2.jar /usr/share/dse/spark/lib/
ドライバーとエグゼキューターのSparkプロパティの設定
Sparkドライバーとエグゼキューターの追加のSparkプロパティは、 spark-defaults.confで設定します。たとえば、Sparkのcommons-crypto
暗号化ライブラリを有効にするには、次のようにします。
spark.network.crypto.enabled true
Sparkでの権限管理の使用
Sparkアプリケーションの起動、停止、管理、および表示を許可するロールのパーミッションを設定します。
Sparkアプリケーションの起動、停止、管理、および表示を許可するロールのパーミッションを設定します。特定のロールのパーミッションを構成するには、CQLコマンドを発行して、WORKPOOL
およびSUBMISSION
データベース・オブジェクトを変更します。
Sparkに適用される権限管理パーミッションは2種類あります。ワーク・プール・パーミッションは、DSEへのSparkアプリケーションの送信機能や表示機能を制御します。サブミット・パーミッションは、特定のアプリケーションの表示機能や管理機能を制御します。Spark Web UIに対して認証と承認が有効になっている場合、これらのパーミッションは、認証されたユーザーに許可される表示機能や変更機能を制御します。
以下の手順はすべて、データベース・スーパーユーザーとしてCQLコマンドを発行することを想定しています。正規データベース・ユーザーとして次のCQLコマンドを発行するには、対象のユーザーにDSE Resource Manager(DSEリソース・マネージャー)RPCを使用するパーミッションを付与する必要があります。
GRANT ALL ON REMOTE OBJECT DseResourceManager TO role;
各DSE Analyticsユーザーには、クライアント・ツールRPCを使用するパーミッションを付与する必要があります。
GRANT ALL ON REMOTE OBJECT DseClientTool TO role;
ロールがSparkアプリケーションを起動するのを承認する
CREATE
パーミッションを使用して、ロールがワーク・プールでSparkアプリケーションを起動できるようにします。
次のCQLコマンドは、Sparkアプリケーションを任意のAnalyticsデータ・センターに送信するパーミッションを付与します。
GRANT CREATE ON ANY WORKPOOL TO role;
次のCQLコマンドは、SparkアプリケーションをAnalyticsデータ・センターの特定のワーク・プールに送信するパーミッションを付与します。
GRANT CREATE ON WORKPOOL datacenter_name.workpool_name TO role;
データ・センター内のすべてのワーク・プールに適用されるように、workpool_name
にワイルドカードを使用できます。
GRANT CREATE ON WORKPOOL datacenter_name.* TO role;
以下の類似する取り消しコマンドを使用できます。
REVOKE CREATE ON ANY WORKPOOL FROM role
REVOKE CREATE ON WORKPOOL datacenter_name.workpool_name FROM role
アプリケーションが送信されると、そのアプリケーションを送信したユーザーにはアプリケーションを管理および取り消すパーミッションが自動的に付与されます。また、そのアプリケーションを管理する機能を別のユーザーまたはロールに付与することもできます。
パーミッションを削除するには、REVOKE
コマンドを使用します。
REVOKE CREATE ON ANY WORKPOOL FROM role;
ロールがSparkアプリケーションを停止または管理するのを承認する
SUBMISSION
オブジェクトにMODIFY
パーミッションを設定することで、Sparkアプリケーションを変更または停止する機能を制御します。
次のCQLコマンドを使用して、任意のワーク・プール内のサブミットを管理するパーミッションを、指定されたロールに付与します。
GRANT MODIFY ON ANY SUBMISSION TO role;
次のCQLコマンドを使用して、指定されたデータ・センター内のサブミットを管理するパーミッションを付与します。
GRANT MODIFY ON ANY SUBMISSION IN WORKPOOL datacenter_name TO role;
次のCQLコマンドを使用して、特定のデータ・センターのワーク・プール内の指定されたIDで識別されたサブミットを管理するパーミッションを付与します。
GRANT MODIFY ON SUBMISSION id IN WORKPOOL datacenter_name.workpool_name TO role;
IDは、SparkアプリケーションIDまたはクラスター・モードで実行されているSparkドライバーのIDのいずれかの文字列です。
パーミッションを削除するには、REVOKE
コマンドを使用します。
REVOKE MODIFY ON SUBMISSION id IN WORKPOOL datacenter_name.workpool_name FROM role;
ロールがSpark Web UIでSparkアプリケーション情報を参照するのを承認する
DESCRIBE
パーミッションを使用して、ロールがSpark Web UIでアプリケーションを参照できるようにします。パーミッションは、ワーク・プールまたはアプリケーション・レベルで設定できます。
次のCQLコマンドを使用して、ロールがAnalyticsデータ・センター内のすべてのアプリケーションを表示できるようにします。
GRANT DESCRIBE ON ANY WORKPOOL TO role;
次のCQLコマンドを使用して、アプリケーションを表示するロールの機能を、Analyticsデータ・センター内の特定のワーク・プールに制限します。
GRANT DESCRIBE ON WORKPOOL datacenter_name.workpool_name TO role;
次のCQLコマンドを使用して、ロールが指定されたロールに対する任意のワーク・プール内のすべてのサブミット(エグゼキューターを含む)を表示できるようにします。
GRANT DESCRIBE ON ANY SUBMISSION TO role;
表示を次の特定のデータ・センターに制限できます。
GRANT DESCRIBE ON ANY SUBMISSION IN WORKPOOL datacenter_name.workpool_name TO role;
さらに、ロールをデータ・センター内の1つのアプリケーションのエグゼキューターの表示のみに制限できます。
GRANT DESCRIBE ON SUBMISSION id IN WORKPOOL datacenter_name.datacenter_name TO role;
パーミッションを削除するには、REVOKE
コマンドを使用します。
REVOKE DESCRIBE ON ANY SUBMISSION IN WORKPOOL datacenter_name.workpool_name FROM role
Sparkサーバー構成
spark-daemon-defaults.confファイルは、DSE Sparkマスターとワーカーを構成します。
cassandra.yaml
cassandra.yamlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/cassandra/cassandra.yaml |
tarボール・インストール | installation_location/resources/cassandra/conf/cassandra.yaml |
spark-daemon-defaults.conf
spark-daemon-defaults.confファイルのデフォルトの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/spark/spark-daemon-defaults.conf |
tarボール・インストール | installation_location/resources/spark/conf/spark-daemon-defaults.conf |
この spark-daemon-defaults.conf ファイルでは、DSE Sparkマスターとワーカーを構成します。
オプション | デフォルト値 | 説明 |
---|---|---|
dse.spark.application.timeout |
30 | ハートビートを受信していない場合は、アプリケーションが停止状態と見なされるまでの時間(秒)。 |
spark.dseShuffle.sasl.port |
7447 | SASLのセキュリティで保護されたアプリケーションのシャッフル・サービスを開始するポート番号。cassandra.yaml内のlisten_address にバインドされています。 |
spark.dseShuffle.noSasl.port |
7437 | セキュリティで保護されていないアプリケーションのシャッフル・サービスを開始するポート番号。cassandra.yaml内のlisten_address にバインドされています。 |
デフォルトでは、Sparkアプリケーション出力の大部分をログに記録するSparkエグゼキューター・ログは、標準出力にリダイレクトされます。出力はSparkワーカーによって管理されます。ログを構成するには、spark-designmon-defaults.confファイルにspark.executor.logs.rolling.*
プロパティを追加します。
spark.executor.logs.rolling.maxRetainedFiles 3
spark.executor.logs.rolling.strategy size
spark.executor.logs.rolling.maxSize 50000
マスターとドライバーに影響を与える追加のSparkプロパティは、spark-daemon-default.confに追加できます。 たとえば、Sparkのcommons-crypto
暗号化ライブラリを有効にするには、次のようにします。
spark.network.crypto.enabled true