Sparkノードの構成

Sparkノードのセキュリティ、パフォーマンス、およびロギングの設定を変更します。

Sparkノードのセキュリティ、パフォーマンス、およびロギングの設定を変更します。

Sparkを使用する場合のhive-site.xmlファイルのデフォルトの場所:

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

/etc/dse/spark/hive-site.xml

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

installation_location/resources/spark/conf/hive-site.xml

環境変数を設定する

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
dse.yamlファイルの場所は、インストールのタイプによって異なります。

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

/etc/dse/dse.yaml

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

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

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

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

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

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

Sparkディレクトリーを保護する

Sparkクラスターを起動すると、DataStax EnterpriseによってSparkワーカーごとにSpark作業ディレクトリーがワーカー・ノード上に作成されます。ワーカー・ノードには複数のワーカーを含めることができ、spark-env.shSPARK_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_LOCAL_DIRSを構成します。

デフォルトのSparkディレクトリーへのアクセス権を付与する

tarボールでインストールした後でノードを起動する前に、デフォルトのSparkディレクトリーの場所である/var/lib/spark/var/log/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.yamlspark_security_enabledオプションを使用して有効にします。この設定をenabledにすると、Sparkマスター・ノードとWorkerノード間の認証がオンになり、暗号化を有効にすることができます。Web UI以外のすべてのコンポーネントのSpark接続を暗号化するには、spark_security_encryption_enabledを有効にします。Sparkコンポーネントのセキュリティ確保に使用される共有シークレットの長さは、spark_shared_secret_bit_lengthオプションを使用して設定され、デフォルト値は256ビットです。これらのオプションについては、「DSE Analyticsのオプション」で説明されています。実稼働環境クラスターの場合は、これらの認証と暗号化を有効にします。これにより、パフォーマンスが大きな影響を受けることはありません。
認証とSparkアプリケーション
認証を有効にすると、ユーザーは、アプリケーションを送信するために認証される必要があります。
権限管理とSparkアプリケーション
DSEの権限管理を有効にすると、ユーザーにはアプリケーションを送信するためのパーミッションが必要になります。また、アプリケーションを送信するユーザーはアプリケーションを管理するためのパーミッションを自動的に受け取り、このパーミッションを任意で他のユーザーに拡張できます。
Spark SQL Thriftサーバーのデータベース認証情報
hive-site.xmlファイルで、Spark SQL Thriftサーバーの認証情報を構成します。以下のように、Sparkディレクトリーでhive-site.xmlファイルを使用します。
Installer-Servicesおよびパッケージのインストール /etc/dse/spark/hive-site.xml
Installer-No Servicesおよびtarボールのインストール installation_location/resources/spark/conf/hive-site.xml
SparkでKerberosを使用する方法
Sparkランチャーは、Kerberos認証を使用して、Kerberos認証情報でDSEに接続し、デリゲーション・トークンを生成するようにDSEに要求します。Sparkドライバーとエグゼキューターは、デリゲーション・トークンを使用してクラスターに接続します。有効な認証を行うために、デリゲーション・トークンを定期的に更新する必要があります。セキュリティ上の理由から、このトークンを使用して認証されるユーザーは、このトークンを更新することはできません。したがって、デリゲーション・トークンには、トークンの所有者とトークンの更新者の2名の関連ユーザーが存在することになります。

トークンの更新者がいない場合、トークンを更新できるのはDSE内部プロセスを通じた場合のみとなります。アプリケーションが送信されると、DSEは、Sparkアプリケーションに関連付けられているデリゲーション・トークンを自動的に更新します。アプリケーションが未登録の場合(終了している場合)、デリゲーション・トークンの更新は停止し、トークンはキャンセルされます。

Kerberosオプションの設定方法については、「Kerberosスキームの定義」を参照してください。

Sparkでの権限管理の使用

Sparkに適用される権限管理パーミッションは2種類あります。ワーク・プール・パーミッションは、DSEへのSparkアプリケーションの送信機能を制御します。サブミット・パーミッションは、特定のアプリケーションの管理機能を制御します。以下の手順はすべて、データベース・スーパーユーザーとしてCQLコマンドを発行することを想定しています。

Sparkアプリケーションを任意のAnalyticsデータ・センターに送信するパーミッションを付与するには、GRANT CREATE ON ANY WORKPOOL TO roleを使用します。

Sparkアプリケーションを特定のAnalyticsデータ・センターに送信するパーミッションを付与するには、GRANT CREATE ON WORKPOOL datacenter_name TO roleを使用します。

以下の類似する取り消しコマンドを使用できます。

REVOKE CREATE ON ANY WORKPOOL FROM role
REVOKE CREATE ON WORKPOOL datacenter_name FROM role

アプリケーションが送信されると、そのアプリケーションを送信したユーザーにはアプリケーションを管理および取り消すパーミッションが自動的に付与されます。また、そのアプリケーションを管理する機能を別のユーザーまたはロールに付与できます。

任意のワーク・プールでのサブミットを管理するパーミッションを指定のロールに付与するには、GRANT MODIFY ON ANY SUBMISSION TO roleを使用します。

指定のデータ・センターでのサブミットを管理するパーミッションを付与するには、GRANT MODIFY ON ANY SUBMISSION IN WORKPOOL datacenter_name TO roleを使用します。

指定のデータ・センターで付与されたIDによって識別されたサブミットを管理するパーミッションを付与するには、GRANT MODIFY ON SUBMISSION id IN WORKPOOL datacenter_name TO roleを使用します。

以下の類似する取り消しコマンドを使用できます。

REVOKE MODIFY ON ANY SUBMISSION FROM role
REVOKE MODIFY ON ANY SUBMISSION IN WORKPOOL datacenter_name FROM role
REVOKE MODIFY ON SUBMISSION id IN WORKPOOL datacenter_name FROM role

正規データベース・ユーザーとしてこれらのコマンドを発行するには、対象のユーザーに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メモリーおよびコアを構成する

Sparkメモリー・オプションは、Sparkエコシステムのさまざまなコンポーネントに影響します。

Spark HistoryサーバーとSpark Thriftサーバーのメモリー
SPARK_DAEMON_MEMORYオプションは、Spark SQL Thriftサーバーと履歴サーバーによって使用されるメモリーを構成します。これらのサーバー・アプリケーションを実行するノードに対して、spark-env.shファイルでこの設定を追加または変更します。
Sparkワーカー・メモリー
SPARK_WORKER_MEMORYオプションは、1つのSparkワーカーによって特定のノードで実行される全エグゼキューターに割り当てることのできるメモリーの合計容量を構成します。
アプリケーション・エグゼキューター・メモリー
アプリケーション用に消費できるメモリー容量をエグゼキューターごとに構成できます。Sparkでは、デフォルト値の512MBが使用されます。spark.executor.memoryオプション(「Spark 1.6.2の使用可能なプロパティ」を参照)または--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ワーカー・コア

    SPARK_WORKER_CORESオプションは、Sparkワーカーによってエグゼキューター用に提供されるコアの数を構成します。単一のエグゼキューターがワーカーから複数のコアを借りることができます。エグゼキューターによって使用されるコアの数は、エグゼキューターによって実行される並列タスクの数と関連しています。クラスターによって提供されるコアの数は、クラスター内のすべてのワーカーによって提供されるコアの合計です。

  • アプリケーション・コア

    アプリケーションのSpark構成オブジェクトでは、spark.cores.max構成プロパティまたは--total-executor-cores cores引数をdse sparkコマンドに対して使用することによって、そのアプリケーションがクラスターから要求するアプリケーション・コアの数を構成できます。

メモリーとコアの割り当ての詳細については、Sparkのドキュメントを参照してください。
DataStax Enterpriseは、特定のSparkワーカーによって提供されるメモリー容量とコア数を半自動的に制御できます。dse.yamlファイルのinitial_spark_worker_resourcesパラメーターは、システム・リソースのどの部分をSparkワーカーで使用できるかを指定します。使用可能なリソースは以下の方法で計算されます。
  • Spark Worker memory = initial_spark_worker_resources * (total system memory - memory assigned to DSE)
  • Spark Worker cores = initial_spark_worker_resources * total system cores
Sparkワーカーのメモリー容量とコア数に割り当てることのできる最小値は、それぞれ64 MBと1コアです。計算結果がこれよりも低い場合、例外はスローされず、自動的に値が制限されます。initial_spark_worker_resources値の範囲は0.01~1です。範囲が指定されていない場合は、デフォルト値の0.7が使用されます。

このメカニズムは、Sparkワーカーのメモリー容量とコア数を設定する場合にデフォルトで使用されます。デフォルトをオーバーライドするには、spark-env.shファイルのSPARK_WORKER_MEMORYオプションとSPARK_WORKER_CORESオプションの一方または両方をコメント解除して編集します。

クラウド環境での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アドレスでのみ通信するようにクラスターに通知が行われます。

cassandra-rackdc.propertiesファイルの場所は、インストールのタイプによって異なります。

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

/etc/dse/cassandra/cassandra-rackdc.properties

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

installation_location/resources/cassandra/conf/cassandra-rackdc.properties

Spark構成を取得するリトライ数の構成

SparkがDSEから構成設定をフェッチすると、構成データを取得できない場合はすぐに失敗しますが、デフォルトでは5回リトライが行われるため、リトライ間の遅延が大きくなります。リトライ数をSpark構成で設定するには、dse sparkコマンドを呼び出す際またはspark-defaults.confspark.dse.configuration.fetch.retries構成プロパティを変更します。

spark-defaults.confファイルのデフォルトの場所は、インストールのタイプによって異なります。

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

/etc/dse/spark/spark-defaults.conf

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

installation_location/resources/spark/conf/spark-defaults.conf

継続的なページングの有効化

継続的なページングでは、DSEからDSE Sparkによって使用されるDataStax Java Driverへとレコードを一括でストリーミングします。デフォルトでは、クエリーでの継続的なページングは無効になっています。有効にするには、Spark SQLシェルを起動する際またはspark-defaults.confspark.dse.continuous_paging_enabled設定をtrueに設定します。例を次に示します。

$ dse spark-sql --conf spark.dse.continuous_paging_enabled=true
注: 継続的なページングを使用すると、データとクエリーに応じて程度は異なりますが、パフォーマンスが3倍にまで向上する可能性があります。パフォーマンスの向上に影響を与える要素としては、ノードごとのエグゼキューターJVMの数とクエリーに含まれるカラムの数が挙げられます。ノードごとのエグゼキューターJVMの数を少なくして、選択されたカラムの数を多くすると、より大きなパフォーマンスの向上が見られました。

SparkノードへのJARの追加

サードパーティJARは、各ノードのSpark libディレクトリーに追加して、クラスターを再起動することで、Sparkノードに追加できます。

Spark libディレクトリーのデフォルトの場所は、インストールのタイプによって異なります。
  • パッケージ・インストールおよびInstaller-Services:/var/lib/spark
  • tarボール・インストールおよびInstaller-No Services:/var/lib/spark
たとえば、パッケージ・インストールでメトリック・レポーターJARをSparkに追加するには、これらをSpark libディレクトリーにコピーします。
$ 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-daemon-defaults.confファイルは、DSE Sparkマスターとワーカーを構成します。

spark-daemon-defaults.confファイルは、DSE Sparkマスターとワーカーを構成します。

表 1. Sparkサーバーの構成プロパティ
オプション デフォルト値 説明
dse.spark.application.timeout 30 ハートビートを受信していない場合は、アプリケーションが停止状態と見なされるまでの時間(秒)。
spark.dseShuffle.sasl.port 7447 SASLのセキュリティで保護されたアプリケーションのシャッフル・サービスを開始するポート番号。cassandra.yamllisten_addressにバインドされています。
spark.dseShuffle.noSasl.port 7437 セキュリティで保護されていないアプリケーションのシャッフル・サービスを開始するポート番号。cassandra.yamllisten_addressにバインドされています。
cassandra.yamlファイルの場所は、インストールのタイプによって異なります。

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

/etc/dse/cassandra/cassandra.yaml

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

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

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

/etc/dse/spark/spark-daemon-defaults.conf

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

installation_location/resources/spark/conf/spark-daemon-defaults.conf