Cloudera Managerが管理する設定ファイルの違いについて

[Cloudera Manager Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cm)の一日目です。

Cloudera Manager（以下CM）はHadoopクラスタのインストール、管理を容易にしてくれるアプリケーションです。アーキテクチャは以下のとおり、CM ServerとAgentが通信し合う構成になっています。

![alt](http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/images/cm_arch.jpg)

CMを使えば、10ノードだろうが1000ノードだろうが、Apache KafkaだろうがApache Sparkをインストールしようが、すべてウィザードを通じてクラスタを構築することが可能です。クラスタの構築後は、core-site.xmlやhdfs-site.xmlなど必要な設定の配布、JAVA_HOMEなどの環境変数の設定をすべてCMが行ってくれます。また、収集したメトリクスをベースにチャートを表示する機能もあり、運用効率が格段にあがるのが特徴です。UIがほぼすべて日本語化されているのも嬉しいポイントでしょう。

さて、CMでは大きくわけて、サーバ設定とクライアント設定という考え方で設定ファイルを管理します。本ポストでは、最新のCM 5.5をベースにして両者の違いについて説明してみます。なお、下記公式ドキュメントを参考にしています。

Cloudera Manager 5 Overview
http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cm_intro_primer.html

# そもそも設定はどこに格納されているか
CMでは、すべての設定変更をUI上で行います。

![alt](https://lh3.googleusercontent.com/FOBV4ILgOpxq4sJ6kzQ77KsjJT--7tQjCHNIgX3l05TQQUwgMQw6xh1CMGp6-5Pzaig4_kKseQkWWnvRgJs-nPltOm3E9MLo2S3fxsKmX_UE4mYAghAZv7zM91XFs7ipaDCHEZVSn_6VcP9HGaUV1rMU7E2i-VgUs-n7AboQKJl4-yNCO6MlCu6BUUz8M-D035R-G3dSl2a49eYsJVz5ERgam4ZnvNwsbfaWqIkZg78A6BzbJwMOpSPoY1Nso0ovIzfpl1h-3HIbwaXAujNdHgRRYdYRmP8I51M3SuZQejOf13fD7LNUi6uxQds5FdcIX8tzIIJyO8MreegXI-gNLFh7CPoWNoxXEAkoC-mKnaJ-vFlRxSXL99PDw4_YCxjNmT_UwUbmsbGJkz13UxICf5PHKvGx8stn2mrraJNtGMtiHleNfNLN1H_oqNGSVwI69LEXAgHk010OgvmS5WSIFixJ3DDCLu4xO8a6AWg3Y6WnQzfgmX3G5vZjIzCZmyDduN6b40Gyq4KmhU4JHrlTuPrsONYY1Tt29uCbBr4=w593-h523-no)

そして、すべての設定内容はバックエンドのデータベースに保存されます。本番環境であれば、MySQLやPostgreSQLあるいはOracleを使用するのが一般的でしょう。

参考: 
Cloudera Manager and Managed Service Data Stores
http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cm_ig_installing_configuring_dbs.html

# サーバ設定

本題です。サーバ設定とは、クラスタで動作する実際のプロセスが使用する設定です。たとえば、HDFSのネームノードやデータノード、YARNであればResourceManagerやNodeManagerとなります。CM管理下のクラスタでは、プロセスの起動停止にinitスクリプトを使用しません。代わりにsupervisordがプロセスの起動停止を管理しています。ここでは、プロセス起動時のステップを紹介しながらサーバ設定がどのようなものか、見ていきましょう。

1. CM管理下のクラスタにおいて、ユーザはプロセスの起動停止を常にCMから行います
![alt](https://lh3.googleusercontent.com/TZSlanTKlShG1SSWeMg4UUyd_t0K2AElKfA-A-IcnnsI4NkpyHxqZxtlBBu_9C-7ofi7TJyjyic-ejJnZ5DxzbWR5lm1AJsQD5H0ZSgJx3JV7f-yfyA7qPKn3sEkknXGk11npGINQxhPIBRS9WSw9hZaChPUkYFrJxaYFagx22qxnCmy2gguSRbHu5tuhCc3IFw9p5ei6gR18hm5u3Sjeebai-zOXXtqnd2xOm13t66zGblU-t1aemtSvoCAdPcAJ91X8YBp02LiIn2ng4zqaQ1fNDYPanXmGBlfWMC_wzRLEd1zSNOZAfOBfouwLjEUnd19A7jVSx-L_7dwTUBxgkjmGniATV-fUdi-255KSFEs9EkEh8LK1CL6GM6IijCjiM0_ia_Srfyi6WLA_-Z4DD4vQs19XbI3UaNVoFPalyosYxeYFAMSGH0ko8_JLyUxazm433XTYcQtM5-Uhbqe0Kr7THnNGcjc3jgJ95ACYDoXdbxc5XVaFRZFl8xDZZ91QNxcZPeUdfCMZvKFyl3aBlNeHTq8MlnE0iuEC0s=w568-h267-no)

2. 起動を選択すると、CM Serverはデータベースに保存された最新の設定を読みだし、適切なxmlファイルやconfファイルを生成します
3. CM Serverは、生成した設定をプロセスが起動するホストのCM Agentへ配布します
4. 設定ファイルを受け取ったAgentは、/var/run/cloudera-scm-agent/process配下に新たなディレクトリを生成し、すべての設定を格納します。このディレクトリはネームノードであれば[数字]-hdfs-NAMENODE、HiveServer2であれば[数字]-hive-HIVESERVER2といったディレクトリ名になります。数字は起動のたびにインクリメントされ、ある時点で最大の数字をもつディレクトリが、起動中のプロセスが使用している設定ファイル群を格納するディレクトリということになります
5. 設定ファイルを格納すると、Agentはsupervisordにプロセスの起動を命じます
6. supervisordは最新のディレクトリから設定を読み込み、プロセスを起動します

プロセスが一度起動すると、/var/run以下の設定ファイルをいくら変更しようが設定は反映されません。反映するにはCMから再起動する必要があります。設定が変更され、再起動が必要な場合には以下のアイコンで通知されます。

![alt](https://lh3.googleusercontent.com/RypNIQfb029cZlC1xrbLpyJBKKum8ZUs-RRbWvuTMK2ciY1SOe2q7m7zjLszD4-8QRXoGICIZcFA19mz92_AFRJndbx6vErkPUPKcS5zX1up9j9DNRQqRLopXa_cxE6PYQyyj7lc1s89cCUn0lIaZdDMN2UN0MSZucQVj9Wce1KJNH8gyYGGNmEWBW8EVZYgeJUgu3orORwZ-tlwQHiG92AQ_eeAxyt_EHWvBZApDW8FvsjZzGnUNULnPqy902gIqu7gABIYbLWG3ou6itcf0zdERRStQs91MX3dbWHufDkGYcofRvCZbQ1DTHIqpb3RdiUQ10R7s-D36Iwyt1WZWyNRvxdSo_Ao8rZnD3JYrVpAeuN6aSVFIXPSIMB02DOHHSKZvgpa_t39pgKI2RXH5INrZKY53PPzgHz3OKUsVLuCO4AJctQMX1ra_NTbOorfduQVcFGOs6MTg2LjwP7auSodj00uta6gIgGYedhk_NoL4PDCi0ni8A5JVY6IS2OT0D7eJrd4Rp7LfXx28bzrX5dosO_R-sNG4G0yKHI=w502-h254-no)

# クライアント設定

さて、サーバ設定が/var/run以下に保持される一方で、CMでは/etc/hadoopや/etc/hiveなどのディレクトリにも設定を配布します。CMを使わずに構築した環境では、すべての設定ファイルを/etc配下で管理しているケースが多いのではないでしょうか。CM環境下では、/etc配下のファイルはクライアントからのみ使用されます。ここでのクライアントとは、hdfs dfsやhdfs dfsadminなどを実行するHDFSクライアント、あるいはbeelineを実行するHiveクライアントなどを意味します。この設定は、「クライアント設定の展開」を実行することでクラスタのホストに配布されます。

![alt](https://lh3.googleusercontent.com/TJVrcFA7cP2h3eH8yLEIHCyFd4Sodeq-vag5KlaIjA_Qi7ODF9FyfK-deMUj4z8r0AfLtaDo6S5p-ekd6X6S4SPQUKLVWbuNkvhPYxAbF51x-_hHXW33Bxa0z3CWrCFgia_hVIWOc68NUchudMjJngmOROaTxVeIfjZU7_oHIjucTHpntJVt_k5BRLamzpdfBWrfumVCwDqFj6S0mWNWzEmRgCipEViJVPz-FspENdEHoKmPDYM_y5OomqA12SkHKzkb7I-CO-CcxRdmC0lzy3cDxdT5Txog34-2YgIUr3s8lmItgJKUq7oogew01QygGpabtQw6pClrPHlI7ak1U3x2_G2-2DZxCXhzYpQ9biKsjTahpoYvKuf0ANyDpJtOVpzg8OVja39Du8IuH1-cXV4rjzxvCW_cDtR1mLNxQs5zYgHOto7Ch79iVNjg73Nyjf1AZJ7CBFJS-fxn0_3wZ4-7GL4EQhC-GUePR3v8PePzRGr4JS5KZicalEX15Yx0zCG5q_ZFckhT7BxwErqAunYNs2fHTa7fkIufcrs=w1030-h888-no)

クライアント設定が更新され、展開が必要な場合には以下のアイコンで通知されます。

![alt](https://lh3.googleusercontent.com/c65OFW16SoFUczYJsv5t0zPInANg1IexB66r8U4Awbz9-RSmYD4S4tYLlXmgeOWk72AZFk3CL41T-qQd3LKS2gUW_IRCm6Fs3WxBZk1VZHCKa8MGpHOoGYpzX_mbk4l_0fuvHd-Sfw-EtIM9qpxfrihOTqUMmr4RoHJIJ97c65ALLXvlaMY7naUzc8pf77obs9A7XtEJtWGA-5PRs6YERT19rl0YCZMZOZK6U70zqbNGfq5nr5MeqHhn-fWIzHQXHK4x-dljO8AgiRnmOsYUKPwOEnUOAmYftAkizO0FVfXEDI4jmyikwE72BnQdsUJBnJ1YL7bB9VXuLdanolHO75fDI3BHr37HARrBih1pwUGiiC18JcUF2emK_fD168x5eALHuyXaZZOoUey-zjeladM9EKopjrEwPHlUd6vUddCQtIw8rFgNKVyDsYJaLr94z8Yr7W6IpUPdZfzl1XoENkMaEQsnud7eJ0eK0jBP36ZfFM0IJ60GDHUyzj018LWF5Mha73M2LCRWfr2zYRXVipc8FnqHxNstFyrZEJ0=w582-h292-no)

本ポストでは、CMを使い始めた方が疑問に抱きがちなサーバ、クライアント設定の違いについて簡単に紹介しました。Hadoopのように複数のホストが協調しあって動作するシステムでは、全てのサーバプロセスが必ず同じ設定を使うように管理することはとても重要です。サーバ側とクライアント側で設定ファイルを区別することで、クライアントが何らかの理由で変更した設定をサーバデーモンが次回起動時に読み込んでしまわないよう、CMでは保証しています。