監視および計測器
Sparkアプリケーションを監視するいくつかの方法があります: web UI、マトリクス、および実験的な計測器。
Web インタフェース
各SparkContextはデフォルトではポート4040でweb UIを起動します。これはアプリケーションに関する有用な情報を表示します。以下のものが含まれます:
- スケジューラのステージおよびタスクのリスト
- RDDサイズおよびメモリの使用量の概要
- 環境情報
- 実行中のexecutorの情報
単にwebブラウザでhttp://<driver-node>:4040
を開くことで、このインタフェースにアクセスできます。同じホスト上で複数のSparkContextが実行中の場合、それらは4040から始まる連続したポートに割り当てられるでしょう(4041, 4042など)。
デフォルトではこの情報はアプリケーションの持続期間のみ利用可能です。後でwebUIを見るためには、アプリケーションの開始前にspark.eventLog.enabled
をtrueに設定します。これはUIに表示された情報を符号化したSparkイベントを永続的なストレージに記録するようにSparkを設定します。
後で見る
Sparkのスタンドアローンモードクラスタマネージャーも独自のweb UIを持ちます。アプリケーションがライフタイムを超えてイベントを記録した場合、スタンドアローンマスターweb UIはアプリケーションが終了した後で自動的にアプリケーションUIを再描画するでしょう。
SparkがMesosあるいはYARN上で実行されている場合でも、アプリケーションのイベントログが存在するならSparkの履歴サーバを使って終了したアプリケーションのUIを再構築することが可能です。以下を実行することで履歴サーバを開始することができます:
./sbin/start-history-server.sh
ファイルシステム プロバイダ クラス(以下のspark.history.providerを見てください)を使っている場合、ログの基本ディレクトリはspark.history.fs.logDirectory
設定オプションで提供され、基本ディレクトリはアプリケーションのログイベントを表すサブディレクトリを含まなければなりません。これはデフォルトではhttp://<server-url>:18080
でwebインタフェースを作成します。履歴サーバは以下のようにして設定することができます:
環境変数 | 意味 |
---|---|
SPARK_DAEMON_MEMORY |
履歴サーバに割り当てるメモリ (デフォルト: 1g)。 |
SPARK_DAEMON_JAVA_OPTS |
履歴サーバのためのJVMオプション (デフォルト: none)。 |
SPARK_PUBLIC_DNS |
履歴サーバの公開アドレス。設定されない場合、アプリケーションの履歴へのリンクはサーバの内部アドレスが使われ、壊れたリンクとなります (デフォルト: none)。 |
SPARK_HISTORY_OPTS |
spark.history.* 履歴サーバの設定オプション (デフォルト: none)。
|
プロパティ名 | デフォルト | 意味 |
---|---|---|
spark.history.provider | org.apache.spark.deploy.history.FsHistoryProvider | アプリケーション履歴のバックエンド実装のクラス名。今のところ、Sparkによって提供された1つの実装しかありません。これはファイルシステムに保存されたアプリケーションログを探します。 |
spark.history.fs.logDirectory | file:/tmp/spark-events | 履歴サーバによってロードされるアプリケーションイベントログを含むディレクトリ |
spark.history.fs.update.interval | 10s | この履歴サーバによって表示される情報が更新される期間各更新は永続化ストレージ内のイベントログになされたどのような変更もチェックします。 |
spark.history.retainedApplications | 50 | UIが保持するアプリケーションの数。この上限を超えると、一番古いアプリケーションが削除されます。 |
spark.history.ui.port | 18080 | 履歴サーバのwebインタフェースが紐付けられるポート。 |
spark.history.kerberos.enabled | false |
履歴サーバがログインするためにkerberosを使わなければならないかどうかを示す。もし履歴サーバがsecureなHadoopクラスタ上のHDFSファイルにアクセスする場合にこれは有用です。これがtrueの場合、spark.history.kerberos.principal およびspark.history.kerberos.keytab の設定が使われます。
|
spark.history.kerberos.principal | (none) | 履歴サーバのためのKerberosプリンシパル名。 |
spark.history.kerberos.keytab | (none) | 履歴サーバのためのkerberosキータブファイルの場所 |
spark.history.ui.acls.enable | false |
アプリケーションを表示するユーザを認証するためにaclがチェックされなければならないかどうかを指定する。有効な場合、アプリケーションが実行される時に各アプリケーションのspark.ui.acls.enable が設定されているかどうかに関係なく、アクセス制御の調査が行われます。アプリケーションの所有者は自身のアプリケーションを見るために常に認証されることになり、アプリエk-ションが実行された場合にspark.ui.view.acls を使って指定された全てのユーザもアプリケーションを見るために認証されるでしょう。無効な場合、一切のアクセス制御が行われません。
|
spark.history.fs.cleaner.enabled | false | 履歴サーバが定期的にイベントログをストレージから削除するかどうかを指定する。 |
spark.history.fs.cleaner.interval | 1d | ジョブ履歴クリーナーがファイルを削除するためにチェックする頻度。もしファイルがspark.history.fs.cleaner.maxAgeより古い場合は、それらは削除されます。 |
spark.history.fs.cleaner.maxAge | 7d | これより古いジョブ履歴ファイルは履歴クリーナーが実行される時に削除されるでしょう。 |
これら全てのUI内でテーブルはヘッダーをクリックすることでソート可能です。遅いタスク、データのゆがみなどを識別するのを容易にします。
履歴サーバは終了したSparkジョブのみを表示することに注意してください。One way to signal the completion of a Spark job is to stop the Spark Context explicitly (sc.stop()
), or in Python using the with SparkContext() as sc:
to handle the Spark Context setup and tear down, and still show the job history on the UI.
REST API
UI内でマトリックスを見ることに加えて、それらはJSONとして利用可能です。これにより開発者は新しい表示方法およびSparkのための監視ツールを簡単に作成することができます。JSONは実行中のアプリケーションおよび履歴サーバ内の両方で利用可能です。エンドポイントは /api/v1
にマウントされます。例えば、履歴サーバの場合、それらは一般的にhttp://<server-url>:18080/api/v1
でアクセスすることができ、実行中のアプリケーションの場合http://localhost:4040/api/v1
で利用可能です。
エンドポイント | 意味 |
---|---|
/applications |
全てのアプリケーションのリスト |
/applications/[app-id]/jobs |
指定されたアプリケーションの全てのジョブのりすと |
/applications/[app-id]/jobs/[job-id] |
指定されたジョブの詳細 |
/applications/[app-id]/stages |
指定されたアプリケーションの全てのステージのリスト |
/applications/[app-id]/stages/[stage-id] |
指定されたステージの全ての試行のリスト |
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id] |
指定されたステージの試行の詳細 |
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskSummary |
指定されたステージの試行の中の全てのタスクのマトリックスの概要。 |
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskList |
指定されたステージの試行の全てのタスクのリスト |
/applications/[app-id]/executors |
指定されたアプリケーションの全てのexecutorのリスト |
/applications/[app-id]/storage/rdd |
指定されたアプリケーションのための保存されたRDDのリスト |
/applications/[app-id]/storage/rdd/[rdd-id] |
指定されたRDDのストレージ状態の詳細 |
/applications/[app-id]/logs |
指定されたアプリケーションの全ての試みについてのイベントログをzipファイルとしてダウンロードします。 |
/applications/[app-id]/[attempt-id]/logs |
指定されたアプリケーションの特定の試みについてのイベントログをzipファイルとしてダウンロードします。 |
Yarnで実行中の場合、各アプリケーションは複数の試行を持ちます。そのため[app-id]
は全ての場合において実際は[app-id]/[attempt-id]
です。
これらのエンドポイントはその上でアプリケーションを開発を容易にするために強くバージョン付けされています。解くに、Sparkは以下を保証します:
- エンドポイントは一つのバージョンからは削除されることはないでしょう
- 各フィールドは全ての指定されたエンドポイントにおいて削除されないでしょう
- 新しいエンドポイントが追加されるかも知れません
- 新しいフィールドが既存のエンドポイントに追加されるかも知れません
- APIの新しいバージョンは将来別個のエンドポイント(例えば、
api/v2
)に追加されるかも知れません。新しいバージョンは後方互換性が必要とされません。 - APIのバージョンは削除されるかも知れませんが、新しいapiバージョンの少なくとも一つの既存のマイナーバージョンがあります。
実行中のアプリケーションのUIを検証する時でも、applications/[app-id]
の分割はたった一つのアプリケーションだけが利用可能だとしてもまだ必要です。例えば、実行中のアプリケーションのジョブのリストを見るには、http://localhost:4040/api/v1/applications/[app-id]/jobs
に行きます。これは両方のモードにおいてパスを矛盾が無い状態にします。
マトリックス
SparkはCoda Hale Metrics Libraryに基づいた設定可能なマトリックスシステムを持っています。これにより、ユーザはSparkマトリックスにHTTP, JMX およびCSV ファイルを含む様々なsinkを伝えることができます。このマトリクスシステムは、Sparkが $SPARK_HOME/conf/metrics.properties
に存在すると期待する設定ファイルを通じて設定することができます。独自のファイルの場所はspark.metrics.conf
の設定プロパティによって指定することができます。SparkのマトリックスはSparkコンポーネントに対応する異なる インスタンス に分離されます。各インスタンスの中で、マトリックが伝える一連のsinkを設定することができます。現在のところ以下のインスタンスがサポートされています:
master
: Spark スタンドアローンマスタープロセス。applications
: 様々なアプリケーション上で報告するマスター内のコンポーネント。worker
: Spark スタンドアローン ワーカープロセス。executor
: Sparkの executor。driver
: Spark ドライバープロセス (SparkContextが生成されるプロセス)。
各インスタンスは0個以上のsinksに対して報告することができます。sinkはorg.apache.spark.metrics.sink
パッケージに含まれています。
ConsoleSink
: コンソールにマトリックス情報を記録します。CSVSink
: 定期的な間隔でマトリックスデータをCSVファイルにエクスポートします。JmxSink
: JMXコンソールで見るためにマトリックスを登録します。MetricsServlet
: マトリックスデータをJSONデータとして提供するために既存のSpark UI内にservletを追加する。GraphiteSink
: マトリックスをGraphiteノードに送信する。Slf4jSink
: マトリックスをログエントリーとしてslf4jに送信する。
Sparkはライセンスの制限のためにデフォルトのビルドに含まれていないGanglia sinkもサポートします:
GangliaSink
: マトリックスをGangliaノードあるいはマルチキャストグループに送信する。
GangliaSink
をインストールするには、Sparkのカスタムビルドを実行する必要があるでしょう。このライブラリを組み込むことでSparkパッケージにLGPLでライセンスされたコードが含まれることに注意してください。sbt ユーザに関しては、ビルドする前に SPARK_GANGLIA_LGPL
環境変数を設定してください。Mavenユーザに関しては、 -Pspark-ganglia-lgpl
プロファイルを有効にします。In addition to modifying the cluster’s Spark build user applications will need to link to the spark-ganglia-lgpl
artifact.
マトリックスの設定の構文は $SPARK_HOME/conf/metrics.properties.template
の例の設定ファイル内で定義されています。
上級の計測器
Sparkのジョブのパフォーマンスをプロファイルするために幾つかの外部ツールを使用することができます。
- Gangliaのようなクラスタ全体の監視ツールはクラスタ全体の使用率やリソースのボトルネックに関する識見を提供することができます。例えば、Gangliaダッシュボードは特定の作業がディスク、ネットワーク、あるいはCPUに束縛しているかどうかを素早く明らかにすることができます。
- dstat, iostat および iotopのようなOSのプロファイルツールは各ノード上の微小なプロファイリングを提供することができます。
- スタックトレースを提供するための
jstack
、ヒープのダンプを作成するためのjmap
、時系列の統計をレポートするためのjstat
および 様々なJVMプロパティを視覚的に調べるためのjconsole
のような JVMユーティリティはJVM内部に慣れるために役に立つでしょう。