Yarnサービスは、アプリケーションをシャットダウンせずに長時間実行アプリケーションをアップグレード/ダウングレードする方法を提供し、このプロセス中のダウンタイムを最小限に抑えます。これは実験的な機能であり、現在デフォルトでは有効になっていません。
Yarnサービスのアップグレードは、3つのステップ (アップグレードの自動終了を選択した場合は2つのステップ) のプロセスです。
サービスアップグレードを開始します。
このステップでは、新しいバージョンのサービスのサービス仕様を提供します。サービスアップグレードが開始されると、サービスの状態は `UPGRADING` に変更されます。
コンポーネントインスタンスをアップグレードします。
このステップでは、個々のコンポーネントインスタンスのアップグレードをトリガーします。インスタンスレベルでアップグレードするためのAPIを提供することにより、ユーザーはサービスに関連する任意の順序でサービス全体のアップグレードを調整できます。
さらに、複数のインスタンス、コンポーネントのすべてのインスタンス、および複数のコンポーネントのすべてのインスタンスをアップグレードするためのAPIがあります。
アップグレードを完了します。
このステップでは、アップグレードの完了を行います。アップグレードを完了するための明示的なステップにより、ユーザーは進行中の現在のアップグレードをキャンセルする機会が得られます。ユーザーがキャンセルを選択した場合、サービスは以前のバージョンに戻すための最善の努力をします。
アップグレードが完了すると、古いサービス定義は新しいサービス定義によって上書きされ、サービスの状態は `STABLE` に変更されます。
`-autoFinalize` オプションを指定してアップグレードを初期化すると、サービスを自動終了できます。自動終了を使用すると、サービスのすべてのコンポーネントインスタンスがアップグレードされたときに、サービスフレームワークによって終了が自動的に実行されます。\
Hadoop 3.2.0以降、アップグレードのキャンセルと高速アップグレードもサポートされています。
アップグレードをキャンセルします。
サービスのアップグレードが完了する前に、ユーザーはアップグレードをキャンセルするオプションがあります。このステップでは、コンポーネント間の依存関係を解決し、アップグレードされた各コンポーネントを順番にロールバックします。
高速アップグレード。
これは、サービスのすべてのコンポーネントをアップグレードするワンステッププロセスです。新しいバージョンのサービスのサービス仕様を提供することが含まれます。サービスマスターは、次の手順を自動的に実行します。
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