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

E-MapReduce:Ray クラスターへのジョブの送信

最終更新日:Jun 10, 2026

Ray クラスターは、EMR Serverless Spark ワークスペースが提供する分散コンピューティングフレームワークです。Python ネイティブの分散コンピューティング、機械学習モデルのトレーニング、推論などのシナリオをサポートしています。このトピックでは、Ray クラスターの作成と起動、および Ray ジョブの送信方法について説明します。

Ray クラスターの作成

  1. EMR Serverless Spark コンソールにログインし、対象のワークスペースに移動します。

  2. 左側のナビゲーションペインで、[クラスター管理] をクリックし、次に [Ray クラスター] タブをクリックします。

  3. [Ray クラスターの作成] をクリックします。表示されるパネルで、次のパラメーターを設定し、[作成] をクリックします。

    • [クラスター名]:クラスター名を入力します。

    • [エンジンバージョン]:エンジンバージョンを選択します。現在のデフォルトは emr-1.0.1 (Ray 2.47.1, Python 3.12) です。

    • [ノードグループ]: CPU と GPU のリソースを混在させて使用する必要がある場合は、個別の CPU ノードグループと GPU ノードグループを作成できます。[+ ワーカーノードグループの追加] をクリックし、次のパラメーターを設定します。

      • [ノードグループ名]: ノードグループに一意の名前を入力します。

      • [リソースキュー]:リソースキューを選択します。

      • [リソース仕様]:ノードのリソース仕様を選択します。

      • [ノード数]:ワーカーノード数を設定します。

    • (オプション) [ネットワーク接続]:Ray クラスターから同じ VPC 内のサービスにアクセスする場合は、既存のネットワーク接続を選択します。

    • (任意) [マネージドファイルディレクトリのマウント]:既存のマネージドファイルディレクトリを選択すると、お使いの Ray ジョブでそのディレクトリ内のファイルの読み取りと書き込みが可能になります。マウントは、CPFS、NAS、OSS からのパスをローカルディレクトリにマッピングする一般的なデータアクセス方法であり、プログラムからローカルパスを使用してデータにアクセスできます。新しいマネージドファイルディレクトリを作成するには、「マネージドファイルディレクトリの管理」をご参照ください。

    • (オプション) クラスターの高度な設定: JSON 形式で高度なパラメーターを設定します。詳細については、「クラスターの高度な設定」をご参照ください。

説明

コンソールでは現在、ワーカーノードのオートスケーリングの設定はサポートされていません。この機能を設定するには、API を使用してください。詳細については、「CreateRayCluster」をご参照ください。

Ray クラスターの起動

  1. Ray クラスターの一覧で、目的のクラスターを見つけ、[開始] をクリックします。

  2. クラスターのステータスが[実行中]になるまで待ちます。

    説明

    ワークスペースで初めて Ray クラスターを起動すると、追加のコンポーネントが作成されるため、2~3 分ほどかかる場合があります。2 回目以降の起動は大幅に高速化されます。

  3. クラスターの起動後、[呼び出し情報] をクリックすると、Ray ジョブのサブミットに必要なエンドポイントアドレスとトークンが表示されます。

    警告

    現在のバージョンでは、Ray クラスターのトークンに有効期限はありません。不正アクセスを防ぐため、トークンは安全に保管してください。

    [ダッシュボード] をクリックすると、Ray クラスターのモニタリングインターフェイスが開き、クラスターのリソース使用状況を表示できます。

Ray ジョブの送信

方法1:インタラクティブな開発

この方法は、クイックスタートとデバッグに最適です。EMR Serverless Spark コンソールの Notebook 環境から、追加のネットワーク設定なしで Ray クラスターに直接接続できます。ローカルマシンから接続する場合は、ローカルマシンから Ray クラスターへネットワーク接続できること、および Python 3.12 環境を使用していることを確認してください。

  1. Ray クライアントをインストールします。

    pip install ray[client]==2.47.1
  2. クラスターの [呼び出し情報] ページで、[gRPC アドレス][トークン] を取得します。

  3. 次のサンプルコードを使用して、Ray クラスターに接続し、インタラクティブな開発を行います。

    import ray
    import os
    
    def get_metadata():
        headers = {"ray-token": "<your_token>"}
        return [(key.lower(), value) for key, value in headers.items()]
    
    ray.init(address="<your_gRPC_address>", _metadata=get_metadata())
    
    import time
    @ray.remote
    def square(x):
        time.sleep(0.1)
        return x * x
    
    futures = [square.remote(i) for i in range(10)]
    
    results = ray.get(futures)
    print("Square results:", results)

    image

方法2:SDKによる送信

この方法は、アプリケーションコードに Ray ジョブの送信を組み込む場合に適しています。ローカル環境に Python 3.12 がインストールされている必要があります。

  1. Ray ジョブ送信クライアントライブラリをインストールします。

    pip install "ray[default]==2.47.1"
  2. クラスターの[呼び出し情報] ページで、[パブリックエンドポイント][トークン] を取得します。

  3. 次のサンプルコードを使用して、Ray クラスターに接続し、ジョブを送信します。

    import time
    from ray.job_submission import JobSubmissionClient
    
    custom_headers = {
        "ray-token": "<your_token>"
    }
    
    client = JobSubmissionClient("<your_public_endpoint>", headers=custom_headers)
    
    # または、内部ネットワークを使用することもできます。この場合、クライアントがクラスターと同じリージョンおよび VPC にあることが必要です。
    # 内部ネットワーク経由での送信は、安定性向上のため推奨します。
    # client = JobSubmissionClient("http://emr-spark-ray-gateway-cn-beijing-internal.spark.emr.aliyuncs.com", headers=custom_headers)
    
    job_id = client.submit_job(
        entrypoint="python -c 'print(\"Hello from Ray Client!\")'"
    )
    
    print(f"Submitted job with ID: {job_id}")
    
    while True:
        status = client.get_job_status(job_id)
        print(f"Job status: {status}")
        if status.is_terminal():
            break
        time.sleep(1)
    
    logs = client.get_job_logs(job_id)
    print("Job logs:")
    print(logs) 

    image

  4. (オプション) ジョブからマウントされたディレクトリ内のファイルにアクセスするには、Ray クラスターの作成時にマネージドファイルディレクトリをマウントします。次に、ジョブの送信時にマウントパスを使用してファイルを参照します。次の例では、OSS ディレクトリを /mnt/myoss パスにマウントしていることを前提としています。

    import time
    from ray.job_submission import JobSubmissionClient
    
    custom_headers = {
        "ray-token": "<your_token>"
    }
    
    client = JobSubmissionClient("<your_public_endpoint>", headers=custom_headers)
    
    # マウントパスを使用して、OSS内のスクリプトファイルをエントリポイントとして直接参照します。
    job_id = client.submit_job(
        entrypoint="python /mnt/myoss/main.py"
    )
    
    print(f"Submitted job with ID: {job_id}")
    
    while True:
        status = client.get_job_status(job_id)
        print(f"Job status: {status}")
        if status.is_terminal():
            break
        time.sleep(1)
    
    logs = client.get_job_logs(job_id)
    print("Job logs:")
    print(logs)
    説明

    Ray ジョブコード内では、マウントパスを使用してファイルの読み書きを直接行うこともできます。たとえば、/mnt/myoss/test.txt から読み取ったり、/mnt/myoss/ ディレクトリにファイルを書き込んだりできます。このディレクトリに書き込まれたファイルは、対応する OSS パスに同期されます。

    次の例は、Ray ジョブ内でマウントされたディレクトリのファイルの読み書きを行う方法を示しています。

    # 次のコードはRay クラスターに送信されます。
    
    import ray
    import time
    
    ray.init()
    
    @ray.remote
    def read_from_mount_path(i):
        with open('/mnt/myoss/test.txt', 'r', encoding='utf-8') as f:
            content = f.read()
        return content
    
    @ray.remote
    def write_to_mount_path(i):
        content = "Hello world " + str(i)
        with open('/mnt/myoss/output' + str(i) + '.txt', 'w', encoding='utf-8') as f:
            f.write(content)
        return 'Write succeeded'
    
    print("--- Starting remote tasks ---")
    start_time = time.time()
    obj_refs = [read_from_mount_path.remote(i) for i in range(4)]
    obj_refs2 = [write_to_mount_path.remote(i) for i in range(4)]
    results = ray.get(obj_refs)
    results2 = ray.get(obj_refs2)

方法3:コマンドラインによる送信

この方法は、外部システムとの統合に最適です。ローカル環境に Python 3.12 がインストールされている必要があります。

  1. Ray ジョブ送信クライアントライブラリをインストールします。

    pip install "ray[default]==2.47.1"
  2. クラスターの[呼び出し情報] ページで、[パブリックエンドポイント][トークン] を取得します。

  3. 次のコマンドを実行して、Ray ジョブを送信します。

    # `ray job submit` を実行する前に、RAY_ADDRESS および RAY_JOB_HEADERS 環境変数を設定する必要があります。
    export RAY_ADDRESS='<your_public_endpoint>'               
    export RAY_JOB_HEADERS='{"ray-token": "<your_token>"}'
    
    # ジョブを送信します
    # 例: 分散ソートを実行するジョブを送信します。
    ray job submit --working-dir "." -- python  test-ray-core-sort.py
    
    # OSSへの読み書きをサポートします。
    ray job submit --working-dir "." -- python test-saving-data-test.py
    
    # OSS-HDFSへの読み書きをサポートします。
    ray job submit --working-dir "." -- python test-saving-data-oss-hdfs-test.py
    
    # コードはマウントされたディレクトリへの読み書きをサポートします。
    ray job submit --working-dir "." -- python  test-saving-data-test-mount.py

その他のコマンドラインパラメーターについては、「Ray ジョブ送信 CLI 公式ドキュメント」をご参照ください。

クラスターの詳細設定

クラスターの詳細設定は JSON 形式で指定します。すべてのパラメータはオプションです。

パラメータ

必須

説明

userDefinedFiles

オプション

クラスター起動時にヘッドノードとワーカーノードにダウンロードする OSS ファイルを指定します。OSS および OSS-HDFS パスをサポートしています。複数のパスはカンマ (,) で区切ります。ファイルは各ノードの /home/ray/work-dir ディレクトリにダウンロードされます。例: oss://mybucket/hello.py,oss://mybucket2/test/test.jar

userRequirementsFile

オプション

ヘッドノードとワーカーノードの Python ベース環境を初期化するために使用する requirements.txt ファイルを指定します。OSS および OSS-HDFS のパスをサポートしています。パスは oss://<bucket>/<path>/requirements.txt 形式である必要があります。Ray クラスターの起動後、システムは自動的に pip install -r requirements.txt コマンドを実行します。これは非同期操作のため、クラスターの起動に影響はありません。