すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:Python SDK を使用した Spark アプリケーションの開発

最終更新日:Aug 25, 2026

このトピックでは、Python SDK を使用して Spark ジョブを投入する方法、Spark ジョブのステータスとログをクエリする方法、Spark ジョブを終了する方法、および Spark 履歴ジョブをクエリする方法について説明します。

前提条件

  • Python 環境がインストールされており、Python のバージョンが 3.7 以降であること。

  • AnalyticDB for MySQL クラスターにジョブリソースグループが作成されます。詳細については、「ジョブリソースグループの作成」をご参照ください。

  • AnalyticDB for MySQL クラスターは、エンタープライズ版、ベーシック版、レイクハウス版のいずれかです。

  • Python SDK がインストールされていること。詳細については、「AnalyticDB MySQL SDK for Python」をご参照ください。

  • 環境変数 ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET が設定されていること。詳細については、「Linux、macOS、Windows で環境変数を設定する」をご参照ください。

  • Spark ログのストレージパスが設定されていること。

    説明

    次のいずれかの方法で Spark ログのストレージパスを設定できます:

    • AnalyticDB for MySQL コンソールの [Spark Jar 開発] ページで、右上隅にある [ログ設定] をクリックして Spark ログのストレージパスを設定します。

    • 設定項目 spark.app.log.rootPath を使用して、Spark ジョブ実行ログを格納する OSS パスを指定します。

例

次のサンプルコードは、Spark ジョブを投入し、ステータスとログをクエリし、ジョブを終了し、履歴ジョブをクエリする方法を示しています。

from alibabacloud_adb20211201.models import SubmitSparkAppRequest, SubmitSparkAppResponse, GetSparkAppStateRequest, \
    GetSparkAppStateResponse, GetSparkAppLogResponse, GetSparkAppLogRequest, KillSparkAppRequest, \
    KillSparkAppResponse, ListSparkAppsRequest, ListSparkAppsResponse
from alibabacloud_tea_openapi.models import Config
from alibabacloud_adb20211201.client import Client

import os


def submit_spark_sql(client: Client, cluster_id, rg_name, sql):
    """
    Spark SQL ジョブを投入します

    :param client:             Alibaba Cloud クライアント
    :param cluster_id:         クラスター ID
    :param rg_name:            リソースグループ名
    :param sql:                SQL
    :return:                   Spark ジョブ ID
    :rtype:                    basestring
    :exception                 ClientException
    """

    # リクエストを初期化します
    request = SubmitSparkAppRequest(
        dbcluster_id=cluster_id,
        resource_group_name=rg_name,
        data=sql,
        app_type="SQL",
        agent_source="Python SDK",
        agent_version="1.0.0"
    )

    # SQL ジョブを投入して結果を取得します
    response: SubmitSparkAppResponse = client.submit_spark_app(request)
    # Spark ジョブ ID を取得します
    print(response)
    return response.body.data.app_id


def submit_spark_jar(client: Client, cluster_id: str, rg_name: str, json_conf: str):
    """
    Spark ジョブを投入します

    :param client:             Alibaba Cloud クライアント
    :param cluster_id:         クラスター ID
    :param rg_name:            リソースグループ名
    :param json_conf:          JSON 設定
    :return:                   Spark ジョブ ID
    :rtype:                    basestring
    :exception                 ClientException
    """

    # リクエストを初期化します
    request = SubmitSparkAppRequest(
        dbcluster_id=cluster_id,
        resource_group_name=rg_name,
        data=json_conf,
        app_type="BATCH",
        agent_source="Python SDK",
        agent_version="1.0.0"
    )

    # Spark ジョブを投入して結果を取得します
    response: SubmitSparkAppResponse = client.submit_spark_app(request)
    # Spark ジョブ ID を取得します
    print(response)
    return response.body.data.app_id


def get_status(client: Client, app_id):
    """
    Spark ジョブのステータスをクエリします

    :param client:             Alibaba Cloud クライアント
    :param app_id:             Spark ジョブ ID
    :return:                   Spark ジョブのステータス
    :rtype:                    basestring
    :exception                 ClientException
    """

    # リクエストを初期化します
    print(app_id)
    request = GetSparkAppStateRequest(app_id=app_id)
    # Spark ジョブのステータスを取得します
    response: GetSparkAppStateResponse = client.get_spark_app_state(request)
    print(response)
    return response.body.data.state


def get_log(client: Client, app_id):
    """
    Spark ジョブのログをクエリします

    :param client:             Alibaba Cloud クライアント
    :param app_id:             Spark ジョブ ID
    :return:                   Spark ジョブのログ
    :rtype:                    basestring
    :exception                 ClientException
    """

    # リクエストを初期化します
    request = GetSparkAppLogRequest(app_id=app_id)

    # Spark ジョブのログを取得します
    response: GetSparkAppLogResponse = client.get_spark_app_log(request)
    print(response)
    return response.body.data.log_content


def kill_app(client: Client, app_id):
    """
    Spark ジョブを終了します

    :param client:             Alibaba Cloud クライアント
    :param app_id:             Spark ジョブ ID
    :return:                   Spark ジョブのステータス
    :exception                 ClientException
    """

    # リクエストを初期化します
    request = KillSparkAppRequest(app_id=app_id)

    # Spark ジョブを終了します
    response: KillSparkAppResponse = client.kill_spark_app(request)
    print(response)
    return response.body.data.state


def list_apps(client: Client, cluster_id: str, page_number: int, page_size: int):
    """
    Spark 履歴ジョブをクエリします

    :param client:             Alibaba Cloud クライアント
    :param cluster_id:         クラスター ID
    :param page_number:        ページ番号。正の整数である必要があります。デフォルト値: 1
    :param page_size:          1 ページあたりのエントリ数
    :return:                   Spark ジョブの詳細
    :exception                 ClientException
    """

    # リクエストを初期化します
    request = ListSparkAppsRequest(
        dbcluster_id=cluster_id,
        page_number=page_number,
        page_size=page_size
    )

    # Spark ジョブの詳細を取得します
    response: ListSparkAppsResponse = client.list_spark_apps(request)
    print("Page Number:", response.body.data.page_number)
    for app_info in response.body.data.app_info_list:
        print(app_info.app_id)
        print(app_info.state)
        print(app_info.detail)


if __name__ == '__main__':
    # クライアント設定
    config = Config(
        # 環境変数 ALIBABA_CLOUD_ACCESS_KEY_ID から AccessKey ID を取得します
        access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
        # 環境変数 ALIBABA_CLOUD_ACCESS_KEY_SECRET から AccessKey secret を取得します
        access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
        # エンドポイント。cn-hangzhou はクラスターのリージョン ID です。
        endpoint="adb.cn-hangzhou.aliyuncs.com"
    )

    # 新規クライアント
    adb_client = Client(config)

    sql_str = """
        -- これは SparkSQL の一例です。内容を修正して、お使いの Spark プログラムを実行してください。
        set spark.driver.resourceSpec=medium;
        set spark.executor.instances=2;
        set spark.executor.resourceSpec=medium;
        set spark.app.name=Spark SQL Test;
        -- ここに SQL 文を記述します
        show databases;
    """

    json_str = """
    {
        "comments": [
            "-- これは SparkPi の一例です。内容を修正して、お使いの Spark プログラムを実行してください。"
        ],
        "args": [
            "1000"
        ],
        "file": "local:///tmp/spark-examples.jar",
        "name": "SparkPi",
        "className": "org.apache.spark.examples.SparkPi",
        "conf": {
            "spark.driver.resourceSpec": "medium",
            "spark.executor.instances": 2,
            "spark.executor.resourceSpec": "medium"
        }
    }
    """
    """
    Spark SQL ジョブを投入します

    cluster_id:    クラスター ID
    rg_name:       リソースグループ名
    """

    sql_app_id = submit_spark_sql(client=adb_client, cluster_id="amv-bp1wo70f0k3c****", rg_name="test", sql=sql_str)
    print(sql_app_id)

    """
    Spark ジョブを投入します

    cluster_id:    クラスター ID
    rg_name:       リソースグループ名
    """

    json_app_id = submit_spark_jar(client=adb_client, cluster_id="amv-bp1wo70f0k3c****",
                                   rg_name="test", json_conf=json_str)
    print(json_app_id)

    # Spark ジョブのステータスをクエリします
    get_status(client=adb_client, app_id=sql_app_id)
    get_status(client=adb_client, app_id=json_app_id)

    """
    Spark 履歴ジョブをクエリします
    cluster_id:      クラスター ID
    page_number:     ページ番号。正の整数である必要があります。デフォルト値: 1
    page_size:       1 ページあたりのエントリ数
    """

    list_apps(client=adb_client, cluster_id="amv-bp1wo70f0k3c****", page_size=10, page_number=1)

    # Spark ジョブを終了します
    kill_app(client=adb_client, app_id=json_app_id)