サービスアップグレード (実験的機能 - テクニカルプレビュー)

Yarnサービスは、アプリケーションをシャットダウンせずに長時間実行アプリケーションをアップグレード/ダウングレードする方法を提供し、このプロセス中のダウンタイムを最小限に抑えます。これは実験的な機能であり、現在デフォルトでは有効になっていません。

概要

Yarnサービスのアップグレードは、3つのステップ (アップグレードの自動終了を選択した場合は2つのステップ) のプロセスです。

  1. サービスアップグレードを開始します。
    このステップでは、新しいバージョンのサービスのサービス仕様を提供します。サービスアップグレードが開始されると、サービスの状態は `UPGRADING` に変更されます。

  2. コンポーネントインスタンスをアップグレードします。
    このステップでは、個々のコンポーネントインスタンスのアップグレードをトリガーします。インスタンスレベルでアップグレードするためのAPIを提供することにより、ユーザーはサービスに関連する任意の順序でサービス全体のアップグレードを調整できます。
    さらに、複数のインスタンス、コンポーネントのすべてのインスタンス、および複数のコンポーネントのすべてのインスタンスをアップグレードするためのAPIがあります。

  3. アップグレードを完了します。
    このステップでは、アップグレードの完了を行います。アップグレードを完了するための明示的なステップにより、ユーザーは進行中の現在のアップグレードをキャンセルする機会が得られます。ユーザーがキャンセルを選択した場合、サービスは以前のバージョンに戻すための最善の努力をします。

    アップグレードが完了すると、古いサービス定義は新しいサービス定義によって上書きされ、サービスの状態は `STABLE` に変更されます。
    `-autoFinalize` オプションを指定してアップグレードを初期化すると、サービスを自動終了できます。自動終了を使用すると、サービスのすべてのコンポーネントインスタンスがアップグレードされたときに、サービスフレームワークによって終了が自動的に実行されます。\

Hadoop 3.2.0以降、アップグレードのキャンセルと高速アップグレードもサポートされています。

  1. アップグレードをキャンセルします。
    サービスのアップグレードが完了する前に、ユーザーはアップグレードをキャンセルするオプションがあります。このステップでは、コンポーネント間の依存関係を解決し、アップグレードされた各コンポーネントを順番にロールバックします。

  2. 高速アップグレード。
    これは、サービスのすべてのコンポーネントをアップグレードするワンステッププロセスです。新しいバージョンのサービスのサービス仕様を提供することが含まれます。サービスマスターは、次の手順を自動的に実行します。
    a. アップグレードが必要なすべてのコンポーネントを検出します。
    b. これらのコンポーネント間の依存関係を解決します。
    c. コンポーネントのアップグレードを順番にトリガーします。

アップグレード例

この例は、sleeperサービスのアップグレードを示しています。以下はsleeperサービス定義です。

{
  "name": "sleeper-service",
  "components" :
    [
      {
        "name": "sleeper",
        "version": "1.0.0",
        "number_of_containers": 1,
        "launch_command": "sleep 900000",
        "resource": {
          "cpus": 1,
          "memory": "256"
       }
      }
    ]
}

ユーザーが `my-sleeper` という名前のsleeperサービスのインスタンスを起動したと仮定します。

{
  "components":
    [
      {
        "configuration": {...},
        "containers":
          [
            {
              "bare_host": "0.0.0.0",
              "component_instance_name": "sleeper-0",
              "hostname": "example.local",
              "id": "container_1531508836237_0002_01_000002",
              "ip": "0.0.0.0",
              "launch_time": 1531941023675,
              "state": "READY"
            },
            {
              "bare_host": "0.0.0.0",
              "component_instance_name": "sleeper-1",
              "hostname": "example.local",
              "id": "container_1531508836237_0002_01_000003",
              "ip": "0.0.0.0",
              "launch_time": 1531941024680,
              "state": "READY"
            }
          ],
        "dependencies": [],
        "launch_command": "sleep 900000",
        "name": "sleeper",
        "number_of_containers": 2,
        "quicklinks": [],
        "resource": {...},
        "restart_policy": "ALWAYS",
        "run_privileged_container": false,
        "state": "STABLE"
      }
    ],
  "configuration": {...},
  "id": "application_1531508836237_0002",
  "kerberos_principal": {},
  "lifetime": -1,
  "name": "my-sleeper",
  "quicklinks": {},
  "state": "STABLE",
  "version": "1.0.0"
}

サービスアップグレードの有効化

以下は、サービスアップグレードを有効にするために必要な `yarn-site.xml` の設定です。

  <property>
    <name>yarn.service.upgrade.enabled</name>
    <value>true</value>
  </property>

アップグレードの開始

ユーザーは、以下のコマンドを使用してアップグレードを開始できます。

yarn app -upgrade ${service_name} -initate ${path_to_new_service_def_file} [-autoFinalize]

例: `my-sleeper` を *900000* ではなく *1200000* スリープするようにアップグレードするには、ユーザーはサービスをバージョン 1.0.1 にアップグレードできます。以下は、sleeper-serviceのバージョン 1.0.1 のサービス定義です。

{
  "components" :
    [
      {
        "name": "sleeper",
        "version": "1.0.1",
        "number_of_containers": 1,
        "launch_command": "sleep 1200000",
        "resource": {
          "cpus": 1,
          "memory": "256"
        }
      }
    ]
}

以下のコマンドは、バージョン 1.0.1 へのアップグレードを開始します。

yarn app -upgrade my-sleeper -initiate sleeper_v101.json

インスタンスのアップグレード

ユーザーは、以下のコマンドを使用してコンポーネントインスタンスをアップグレードできます。

yarn app -upgrade ${service_name} -instances ${comma_separated_list_of_instance_names}

例:以下のコマンドは、 `my-service` の `sleeper-0` および `sleeper-1` インスタンスをアップグレードします。

yarn app -upgrade my-sleeper -instances sleeper-0,sleeper-1

コンポーネントのアップグレード

ユーザーは、1つのコマンドでコンポーネント、つまりコンポーネントのすべてのインスタンスをアップグレードできます。

yarn app -upgrade ${service_name} -components ${comma_separated_list_of_component_names}

例:以下のコマンドは、 `my-service` の `sleeper` コンポーネントのすべてのインスタンスをアップグレードします。

yarn app -ugrade my-sleeper -components sleeper

アップグレードの完了

ユーザーは、以下のコマンドを使用してアップグレードを完了する必要があります(開始時にautoFinalizeが指定されていないため)。

yarn app -upgrade ${service_name} -finalize

例:以下のコマンドは、 `my-sleeper` のアップグレードを完了します。

yarn app -upgrade my-sleeper -finalize

アップグレードのキャンセル

ユーザーは、以下のコマンドを使用して、完了する前にアップグレードをキャンセルできます。

yarn app -upgrade ${service_name} -cancel

例:アップグレードが完了する前に、以下のコマンドは `my-sleeper` のアップグレードをキャンセルします。

yarn app -upgrade my-sleeper -cancel

高速アップグレード

ユーザーは、以下のコマンドを使用して、サービスを1つにアップグレードできます。

yarn app -upgrade ${service_name} -express ${path_to_new_service_def_file}

例:以下のコマンドは、 `my-sleeper` を高速アップグレードします。

yarn app -upgrade my-sleeper -express sleeper_v101.json