このドキュメントでは、YARNサービスフレームワークを使用してYARN上にサービスを展開する方法について説明します。
通常どおり、HDFSとYARNのすべてのHadoopコンポーネントを起動します。YARNサービスフレームワークを有効にするには、このプロパティを`yarn-site.xml`に追加し、ResourceManagerを再起動するか、ResourceManagerが起動する前にプロパティを設定します。このプロパティは、CLIまたはREST APIを通じてYARNサービスフレームワークを使用するために必要です。
<property> <description> Enable services rest api on ResourceManager. </description> <name>yarn.webapp.api-service.enable</name> <value>true</value> </property>
以下は、単純なspecファイルを作成し、コードを書かずにYARN上でスリープコンテナを起動する単純なサービス定義です。
{ "name": "sleeper-service", "version": "1.0", "components" : [ { "name": "sleeper", "number_of_containers": 1, "launch_command": "sleep 900000", "resource": { "cpus": 1, "memory": "256" } } ] }
ユーザーは、以下のコマンドを使用して、事前に構築されたサンプルサービスをYARN上で簡単に実行できます。
yarn app -launch <service-name> <example-name>
例:以下のコマンドは、YARN上に`my-sleeper`という名前の`sleeper`サービスを起動します。
yarn app -launch my-sleeper sleeper
YARNサービスフレームワークを使用したDockerベースのサービスの起動については、APIドキュメントを参照してください。
以下の手順では、CLIを使用してYARN上にサービスを展開する方法について説明します。コマンドとオプションの完全なリストについては、Yarnコマンドを参照してください。
yarn app -launch ${SERVICE_NAME} ${PATH_TO_SERVICE_DEF_FILE}
パラメータ
例
yarn app -launch sleeper-service /path/to/local/sleeper.json
コンポーネントのコンテナ数を増減します。
yarn app -flex ${SERVICE_NAME} -component ${COMPONENT_NAME} ${NUMBER_OF_CONTAINERS}
例:`sleeper-service`という名前のサービスの場合
`sleeper`コンポーネントを`2`個のコンテナ(絶対数)に設定します。
yarn app -flex sleeper-service -component sleeper 2
フレックスコマンドの${NUMBER_OF_CONTAINERS}では、+2や-2などの相対的な変更もサポートされています。
サービスを停止すると、サービスのすべてのコンテナとアプリケーションマスターが停止しますが、hdfs上のサービスルートフォルダなど、サービスの状態は削除されません。
yarn app -stop ${SERVICE_NAME}
停止したサービスの再起動は簡単です。startコマンドを呼び出すだけです!
yarn app -start ${SERVICE_NAME}
サービスを停止することに加えて、hdfs上のサービスルートフォルダとYARNサービスレジストリ内のレコードも削除します。
yarn app -destroy ${SERVICE_NAME}
YARN APIサーバーREST APIは、`yarn.webapp.api-service.enable`がtrueに設定されている場合、ResourceManagerの一部として有効になります。
ResourceManager Webエンドポイントを通じて、YARN上にサービスを展開できます。
詳細なAPI仕様については、APIドキュメントを参照してください。
前述のサンプルサービス定義をResourceManager api-serverエンドポイントにPOSTします。
POST https://127.0.0.1:8088/app/v1/services
GET https://127.0.0.1:8088/app/v1/services/${SERVICE_NAME}
PUT https://127.0.0.1:8088/app/v1/services/${SERVICE_NAME}/components/${COMPONENT_NAME}
PUT
リクエスト本文
{ "name": "${COMPONENT_NAME}", "number_of_containers": ${COUNT} }
例
{ "name": "sleeper", "number_of_containers": 2 }
サービスを停止すると、サービスのすべてのコンテナとアプリケーションマスターが停止しますが、hdfs上のサービスルートフォルダなど、サービスの状態は削除されません。
PUT https://127.0.0.1:8088/app/v1/services/${SERVICE_NAME}
PUT
リクエスト本文
{ "name": "${SERVICE_NAME}", "state": "STOPPED" }
停止したサービスの再起動は簡単です。
PUT https://127.0.0.1:8088/app/v1/services/${SERVICE_NAME}
PUT
リクエスト本文
{ "name": "${SERVICE_NAME}", "state": "STARTED" }
サービスを停止することに加えて、hdfs上のサービスルートフォルダとYARNサービスレジストリ内のレコードも削除します。
DELETE https://127.0.0.1:8088/app/v1/services/${SERVICE_NAME}
YARN UI2には、YARNサービスを第一級の方法で表示するために、新しい`service`タブが追加されています。サービスフレームワークはデータをタイムラインサービスに投稿し、`service` UIはタイムラインサービスからデータを読み取ってコンテンツをレンダリングします。
タイムラインサービスv2の有効化については、TimeLineService v2ドキュメントを参照してください。
`yarn-site.xml`に以下の設定を行い、ResourceManagerを起動します。ソースコードからビルドする場合は、`mvn`コマンドで`-Pyarn-ui`を使用してください。これにより、新しいYARN UIのwarファイルが生成されます。
<property> <description>To enable RM web ui2 application.</description> <name>yarn.webapp.ui2.enable</name> <value>true</value> </property>
YARNサービスフレームワークは、セキュア(Kerberized)環境での実行をサポートしています。ユーザーは、サービスを起動する際にKerberosプリンシパル名とキータブを指定する必要があります。例:一般的な設定は次のようになります。
{ "name": "sample-service", ... ... "kerberos_principal" : { "principal_name" : "hdfs-demo/_HOST@EXAMPLE.COM", "keytab" : "file:///etc/security/keytabs/hdfs.headless.keytab" } }
`_HOST`は`principal_name`フィールドで必須です。これは、Hadoopクライアントがサーバー(この場合はAM)と通信する際に、サーバーのプリンシパルにホスト名が存在することを検証するためです。* principal_name:サービスを起動するユーザーのプリンシパル名 * keytab:keytabのURI。現在、ベアメタルホスト上に存在するファイルのみをサポートしています。* URIは`file://`で始まる - ローカルホスト上のkeytabが保存されているパス。AMが起動する前に、管理者がローカルホストにkeytabを事前にインストールすることが想定されています。
上記の例は、Dockerコンテナ以外のサービスのみを対象としています。YARNサービスフレームワークは、Dockerベースのサービスの管理も第一級でサポートしています。Dockerベースのサービスの管理手順の大部分は同じですが、Dockerではコンポーネントの`Artifact`タイプが`DOCKER`になり、Artifact `id`がDockerイメージの名前になります。YARNへのDockerの設定方法の詳細については、YARN上のDockerを参照してください。
Dockerのサポートにより、DNSを使用してYARN上のサービスコンテナを検出するなどの機能を実装するための新しい可能性も開かれます。詳細については、ServiceDiscoveryを参照してください。