Spark ストリーミングアプリケーションのデバッグDebugging Spark Streaming Application

このガイドでは、Spark Streaming アプリケーションの内部をピークするために使用できるさまざまなデバッグオプションについて説明します。This guide walks you through the different debugging options available to peek at the internals of your Spark Streaming application. 次の3つの重要な場所があります。The three important places to look are:

  • Spark UISpark UI
  • ドライバーログDriver Logs
  • 実行プログラムログExecutor Logs

Spark UISpark UI

ストリーミングジョブを開始すると、Spark および Streaming UI に豊富な情報が表示され、ストリーミングアプリケーションの動作について詳しく知ることができます。Once you start the streaming job, there is a wealth of information available in the Spark and Streaming UI to know more about what’s happening in your streaming application. Spark UI にアクセスするには、次に示すように、接続されたクラスターをクリックします。To get to the Spark UI, you can click on the attached cluster as shown below

代替テキスト](../../../_static/images/spark/legacy-streaming/Getting2SparkUI.png) を ![no-alternative-text

[ストリーミング] タブStreaming Tab

Spark UI にアクセスすると、ストリーミングジョブがこのクラスターで実行されている場合は [ストリーミング] タブが表示されます。Once you get to the Spark UI, you will see a Streaming tab if a streaming job is running in this cluster. (_このクラスターで実行されているストリーミングジョブがない場合、このタブは表示されません。ストリーミングジョブの開始中に発生した可能性がある例外を確認する方法については、この notebook の「ドライバーログ」セクションを参照_してください)。(If there is no streaming job running in this cluster, then this tab will not be visible. You can skip to the “Driver Logs” section in this notebook to know how to check for exceptions that might have happened while starting the streaming job.)

このページで最初に調べることは、ストリーミングアプリケーションがソースから入力イベントを受信しているかどうかを確認することです。The first thing to look for in this page is to check if your streaming application is receiving any input events from your source. この場合、ジョブが1000イベント/秒を受け取ることを確認できます。In this case, you can see the job receives 1000 events/second. (注: TextFileStream の場合、ファイルは入力であるため、入力イベントの # は常に0になります。このような場合は、notebook の「完了したバッチ」セクションを参照して、詳細情報を確認することができます)。(Note: For TextFileStream, since files are input, the # of input events is always 0. In such cases, you can look at the “Completed Batches” section in the notebook to figure out how to find more information.)

複数の入力ストリームを受信するアプリケーションがある場合は、[入力速度] リンクをクリックすると、各受信者に対して受信したイベントの数が表示されます。If you have an application that receives multiple input streams, you can click on the “Input Rate” link which will show the # of events received for each receiver.

代替テキスト](../../../_static/images/spark/legacy-streaming/StreamingTab.png) を ![no-alternative-text

処理時間Processing Time

下にスクロールすると、"処理時間" のグラフが表示されます。As you scroll down, find the graph for “Processing Time”. これは、ストリーミングジョブのパフォーマンスを理解するための重要なグラフの1つです。This is one of the key graphs to understand the performance of your streaming job. 一般的な経験則として、バッチ処理時間の80% 以内に各バッチを処理できるかどうかを確認することをお勧めします。As a general rule of thumb, it is good if you can process each batch within 80% of your batch processing time.

このアプリケーションでは、バッチ間隔は2秒でした。For this application, the batch interval was 2 seconds. 平均処理時間は450ms で、バッチ間隔の下にあります。The average processing time is 450ms which is well under the batch interval. 平均処理時間がバッチ間隔より近い場合、またはバッチ間隔よりも大きい場合は、ストリーミングアプリケーションを作成します。これにより、すぐにキューに入れられ、バックログが最終的にストリーミングジョブを停止する可能性があります。If the average processing time is closer or greater than your batch interval, then you will have a streaming application that will start queuing up resulting in backlog soon which can bring down your streaming job eventually.

代替テキスト](../../../_static/images/spark/legacy-streaming/ProcessingTime.png) を ![no-alternative-text

完了したバッチCompleted Batches

ページの末尾に向かって、完了したすべてのバッチの一覧が表示されます。Towards the end of the page, you will see a list of all the completed batches. ページには、最後に完了した1000バッチの詳細が表示されます。The page displays details about the last 1000 batches that completed. この表から、各バッチに対して処理されたイベントの数とその処理時間を取得できます。From the table, you can get the # of events processed for each batch and their processing time. バッチの1つで何が起こったかについて詳しく知りたい場合は、[batch] リンクをクリックして、[バッチの詳細] ページに移動します。If you want to know more about what happened on one of the batches, you can click on the batch link to get to the Batch Details Page.

代替テキスト](../../../_static/images/spark/legacy-streaming/CompletedBatches.png) を ![no-alternative-text

[バッチの詳細] ページBatch Details Page

このページには、バッチについて知る必要があるすべての詳細情報が含まれています。This page has all the details you want to know about a batch. 次の2つの重要な点があります。Two key things are:

  • Input: バッチへの入力に関する詳細が含まれています。Input: It has details about the input to the batch. この例では、このバッチに対する Spark Streaming によって読み取られる kafka トピック、パーティション、およびオフセットに関する詳細が含まれています。In this case, it has details about the kafka topic, partition and offsets read by Spark Streaming for this batch. TextFileStream の場合は、このバッチで読み取られたファイル名の一覧が表示されます。In case of TextFileStream, you will see a list of file names that was read for this batch. これは、テキストファイルから読み取りを行うストリーミングアプリケーションのデバッグを開始するための最適な方法です。This is the best way to start debugging a Streaming application reading from text files.
  • [処理中]: ジョブ ID へのリンクをクリックすると、このバッチ中に行われた処理の詳細がすべて表示されます。Processing: You can click on the link to the Job ID which has all the details about the processing done during this batch.

代替テキスト](../../../_static/images/spark/legacy-streaming/BatchDetailsPage.png) を ![no-alternative-text

[ジョブの詳細] ページJob Details Page

[ジョブの詳細] ページには、バッチの DStream DAG 視覚エフェクトが表示されます。The job details page shows the DStream DAG visualization for the batch. これは、すべてのバッチの操作の DAG を理解するのに非常に便利な視覚化です。This is a very useful visualization to understand the DAG of operations for every batch. この場合は、kafka direct ストリームからのバッチ読み取りの入力の後にフラットマップ操作が行われ、次にマップ操作が行われていることがわかります。In this case, you can see that the batch read input from kafka direct stream followed by a flat map operation and then a map operation. その後、結果として得られた DStream を使用して、updateStateByKey を使用してグローバル状態を更新します。The resulting DStream was then used to update a global state using updateStateByKey. (グレーのボックスはスキップされたステージを表します。(The greyed boxes represents skipped stages. Spark は、再計算が不要な場合に、一部のステージをスキップするのに十分なスマートです。Spark is smart enough to skip some stages if they don’t need to be recomputed. データがチェックポイントまたはキャッシュされている場合、Spark はこれらのステージの再計算をスキップします。If the data is checkpointed or cached, then Spark would skip recomputing those stages. この場合、これらのステージは、updateStateBykey が原因で、前のバッチの依存関係に対応します。In this case, those stages correspond to the dependency on previous batches because of updateStateBykey. Spark Streaming は DStream を内部でチェックポイントし、前のバッチで依存関係を終了する代わりにチェックポイントから読み取るため、グレーのステージとして表示されます。Since Spark Streaming internally checkpoints the DStream and it reads from the checkpoint instead of dependending on the previous batches, they are shown as greyed stages.)

ページの下部には、このバッチに対して実行されたジョブの一覧も表示されます。At the bottom of the page, you will also find the list of jobs that were executed for this batch. 説明のリンクをクリックすると、タスクレベルの実行にドリルダウンできます。You can click on the links in the description to drill further into the task level execution.

代替テキスト](../../../_static/images/spark/legacy-streaming/JobDetailsPage1.png) を ![no-alternative-text

代替テキスト](../../../_static/images/spark/legacy-streaming/JobDetailsPage2.png) を ![no-alternative-text

タスクの詳細ページTask Details Page

これは、spark ストリーミングアプリケーションの Spark UI から取得できる、最も詳細なデバッグレベルです。This is the most granular level of debugging you can get into from the Spark UI for a Spark Streaming application. このページには、このバッチに対して実行されたすべてのタスクが含まれています。This page has all the tasks that were executed for this batch. ストリーミングアプリケーションのパフォーマンスの問題を調査している場合、このページには、実行されたタスクの数、実行された場所 (実行プログラム)、シャッフル情報などの情報が表示されます。If you are investigating performance issues of your streaming application, then this page would provide information like the # of tasks that were executed and where they were executed (on which executors), shuffle information, etc.

デバッグのヒント: タスクがクラスター内の複数の実行プログラム (ノード) で実行されていることを確認して、処理中に十分な並列処理を行ってください。Debugging TIP: Ensure that the tasks are executed on multiple executors (nodes) in your cluster to have enough parallelism while procesing. 受信側が1つの場合、クラスター内に複数の実行プログラムがある場合、1つの実行プログラムだけがすべての処理を実行している可能性があります。If you have a single receiver, sometimes only one executor might be doing all the work though you have more than one executor in your cluster.

代替テキスト](../../../_static/images/spark/legacy-streaming/TaskDetailsPage.png) を ![no-alternative-text

ドライバーログDriver Logs

ドライバーログは、次の2つの目的で役立ちます。Driver logs are helpful for 2 purposes:

  • 例外: Spark UI に [ストリーミング] タブが表示されない場合があります。Exceptions: Sometimes, you may not see the streaming tab in the Spark UI. これは、何らかの例外が発生したため、ストリーミングジョブが開始されなかったためです。This is because the Streaming job was not started because of some exception. ドライバーログを掘り下げて、例外のスタックトレースを調べることができます。You can drill into the Driver logs to look at the stack trace of the exception. 場合によっては、ストリーミングジョブが正常に開始された可能性があります。In some cases, the streaming job may have started properly. ただし、すべてのバッチが [完了したバッチ] セクションに移動することはありません。But you will see all the batches never going to the Completed batches section. すべての状態が "処理中" または "失敗" になっている可能性があります。They might all be in processing or failed state. このような場合でも、ドライバーログを使用すると、根本的な問題の性質を理解するのに便利です。In such cases too, driver logs could be handy to understand on the nature of the underlying issues.
  • 印刷: DStream DAG の一部として印刷ステートメントを実行すると、ログにも表示されます。Prints: Any print statements as part of the DStream DAG shows up in the logs too. DStream の内容をすばやく確認する場合は、dstream.print() (幅 1) または dstream.pprint() (python) を実行できます。If you want to quickly check the contents of a DStream, you can do dstream.print() (scala) or dstream.pprint() (python). DStream の内容がログに記録されます。The contents of the DStream will be in the logs. dstream.foreachRDD{ print statements here }することもできます。You can also do dstream.foreachRDD{ print statements here }. また、ログにも表示されます。They will also show up in the logs. (注: DStream DAG の外部にあるストリーミング関数に print ステートメントを含めるだけでは、ログには表示されません。Spark Streaming は、DStream DAG だけを生成して実行します。そのため、print ステートメントはその DAG の一部である必要があります)。(Note: Just having print statements in the streaming function outside of the DStream DAG will not show up in the logs. Spark Streaming generates and executes only the DStream DAG. So the print statements have to be part of that DAG.)

次の表は、dstream の変換と、変換に print ステートメントが含まれている場合の対応するログの場所を示しています。The following table shows the dstream transformations and where the corresponding log location would be if the transformation had a print statement:

説明Description 場所Location
foreachRDD ()、transform ()foreachRDD(), transform() ドライバーの Stdout ログDriver Stdout Logs
foreachPartition()foreachPartition() 実行プログラムの Stdout ログExecutor’s Stdout Logs

ドライバーログにアクセスするには、接続されたクラスターをクリックします。To get to the driver logs, you can click on the attached cluster.

代替テキスト](../../../_static/images/spark/legacy-streaming/Get2DriverLogs.png) を ![no-alternative-text

代替テキスト](../../../_static/images/spark/legacy-streaming/DriverLogs.png) を ![no-alternative-text

注: pyspark streaming の場合、すべての印刷と例外がログに自動的に表示されるわけではありません。Note: For pyspark streaming, all the prints and exceptions does not automatically show up in the logs. 現在の制限は、ログを表示するには notebook セルをアクティブにする必要があるということです。The current limitation is that a notebook cell needs to be active for the logs to show up. ストリーミングジョブはバックグラウンドスレッドで実行されるため、ログは失われます。Since the streaming job runs in the background thread, the logs are lost. Pyspark streaming アプリケーションの実行中にログを表示するには、notebook 内のセルのいずれかに ssc.awaitTerminationOrTimeout(x) を指定します。If you want to see the logs while running a pyspark streaming application, you can provide ssc.awaitTerminationOrTimeout(x) in one of the cells in the notebook. これにより、セルは ' x ' 秒間保持されます。This will put the cell on hold for ‘x’ seconds. ' X ' 秒の後、その期間中のすべての印刷と例外がログに記録されます。After the ‘x’ seconds, all the prints and exceptions during that time will be present in the logs.

実行プログラムログExecutor Logs

実行プログラムログは、特定のタスクが不適切であり、特定のタスクのログを表示したい場合に便利です。Executor logs are sometimes helpful if you see certain tasks are misbehaving and would like to see the logs for specific tasks. 上に示したタスクの詳細ページから、タスクが実行された実行プログラムを取得できます。From the task details page shown above, you can get the executor where the task was run. その後、[クラスター] UI ページにアクセスし、[#] ノードをクリックして、マスターをクリックします。Once you have that, you can go to the clusters UI page, click on the # nodes and then the master. マスターページには、すべてのワーカーが一覧表示されます。The master page lists all the workers. 疑わしいタスクが実行されたワーカーを選択し、log4j 出力にアクセスできます。You can choose the worker where the suspicious task was run and then get to the log4j output.

代替テキスト](../../../_static/images/spark/legacy-streaming/Clusters.png) を ![no-alternative-text

代替テキスト](../../../_static/images/spark/legacy-streaming/SparkMaster.png) を ![no-alternative-text

代替テキスト](../../../_static/images/spark/legacy-streaming/ExecutorPage.png) を ![no-alternative-text