次の方法で共有


Fabric の NotebookUtils セッション管理

notebookutils.sessionを使用して、Microsoft Fabric のノートブック セッションのライフサイクルを管理します。 対話型セッションを停止するか、クリーンアップ、リソース管理、エラー復旧のために Python インタープリターを再起動できます。

次の表に、使用可能なセッション管理方法を示します。

メソッド 署名 説明
stop stop(): void 現在の対話型セッションを非同期的に停止し、リソースを解放します。 PySpark、Scala、R ノートブックでは、省略可能な detach パラメーターを受け取ります。
restartPython restartPython(): void Spark コンテキストをそのまま維持したまま、Python インタープリターを再起動します。 Python および PySpark ノートブックでのみ使用できます。

stop()メソッドは、Python、PySpark、Scala、および R ノートブックで使用できます。 PySpark、Scala、R ノートブックでは、 stop() は省略可能な detach パラメーター ( stop(detach=True)) を受け入れます。 detachTrue (既定) の場合、セッションは完全に停止するのではなく、コンカレンシーの高いセッションからデタッチされます。

restartPython() メソッドは、Python ノートブックと PySpark ノートブックでのみ使用できます。 Scala または R ノートブックでは使用できません。

Important

パイプライン実行モードでは、コードの完了後にセッションが自動的に停止します。 session.stop() API は、主に、停止ボタンをクリックするのではなく、プログラムでセッションを停止する対話型セッションを対象としています。

stop() メソッドはバックグラウンドで非同期的に動作し、Spark セッション リソースを解放して、同じプール内の他のセッションで使用できるようにします。

対話型セッションの停止

停止ボタンを手動で選択する代わりに、コードで API を呼び出すことで対話型セッションを停止できます。

notebookutils.session.stop()

notebookutils.session.stop() API は、バックグラウンドで現在の対話型セッションを非同期的に停止します。 また、Spark セッションを停止し、セッションによって占有されているリソースを解放するため、同じプール内の他のセッションでも使用できます。

session.stop()後のコードは実行されません。 セッションが停止すると、すべてのメモリ内データと変数が失われます。 session.stop()を呼び出す前に重要なデータを保存します。

戻り動作

stop() メソッドは値を返しません。 セッションの非同期シャットダウンを開始します。

Python インタープリターを再起動する

notebookutils.session.restartPython()を使用して Python インタープリターを再起動します。

PySpark (Spark) ノートブックでは、 restartPython() は Spark コンテキストをそのまま維持しながら Python インタープリターのみを再起動します。 Spark コンテキストを持たない Python ノートブックでは、python プロセス全体を再起動 restartPython()

notebookutils.session.restartPython()

戻り動作

restartPython() メソッドは値を返しません。 再起動が完了すると、次のセルでコードの実行が続行されます。

以下の考慮事項に留意してください。

  • ノートブック参照の実行ケースでは、 restartPython() は、参照されている現在のノートブックの Python インタープリターのみを再起動します。 親ノートブックには影響しません。
  • まれに、Spark リフレクション メカニズムが原因でコマンドが失敗することがあります。 再試行を追加すると、問題を軽減できます。
  • restartPython()を呼び出した後、次のセルでコードの実行が続行されます。 新しくインストールされたパッケージを後続のセルにインポートします。

使用パターン

停止前に優雅にクリーンアップする

try-finally ブロックを使用して、セッションが停止する前にクリーンアップが確実に実行されるようにします。

try:
    print("Starting data processing...")
    # ... processing logic here ...

except Exception as e:
    print(f"Processing failed: {str(e)}")
    raise

finally:
    print("Performing cleanup...")
    try:
        notebookutils.fs.unmount("/mnt/data")
    except:
        pass

    notebookutils.session.stop()

パッケージをインストールしてインタープリターを再起動する

pipを使用して新しいパッケージをインストールした後、Python インタープリターを再起動して、パッケージを使用できるようにします。

import subprocess
import sys

packages = ["pandas==2.0.0", "numpy==1.24.0"]

print("Installing packages...")
for package in packages:
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

print("Restarting Python interpreter...")
notebookutils.session.restartPython()

restartPython()を呼び出した後、次のセルでコードの実行が続行されます。 新しくインストールしたパッケージを後続のセルにインポートします。

インタープリターの再起動によるエラー復旧

Python インタープリターが破損した状態に達した場合は、再起動して回復を試みることができます。

def recover_from_error():
    """Attempt to recover from errors by restarting Python."""

    try:
        test_value = 1 + 1
    except Exception as e:
        print(f"Python interpreter error: {str(e)}")
        print("Restarting Python interpreter...")
        notebookutils.session.restartPython()
        return False

    return True

if not recover_from_error():
    print("Recovery attempted - check next cell")

停止前のリソースのクリーンアップ

セッションを終了する前に、マウントされたパス、一時ファイル、キャッシュをクリーンアップします。

try:
    df = spark.range(0, 1000000)
    df.cache()
    result = df.count()
    print(f"Processing completed: {result}")

except Exception as e:
    print(f"Operation failed: {str(e)}")
    raise

finally:
    spark.catalog.clearCache()
    print("Stopping session to free resources...")
    notebookutils.session.stop()

対話型モードのみの条件付き停止

パイプライン モードで不要な呼び出しが発生しないように、停止する前に実行コンテキストを確認します。

context = notebookutils.runtime.context

if not context['isForPipeline']:
    print("Interactive mode: stopping session...")
    notebookutils.session.stop()
else:
    print("Pipeline mode: session stops automatically after execution")

ヒント

session.stop()またはsession.restartPython()を呼び出す前に、データフレームのストレージへの書き込みや出力のログ記録などの重要な結果を常に保存してください。 どちらの操作も、メモリ内のすべての状態を破棄します。