ZooKeeper サービスが不安定になる、または予期せず再起動する理由は何ですか?
最も一般的な原因は、znode の数が多すぎる、またはスナップショットのサイズが大きすぎるためです。ZooKeeper はすべての znode をメモリ上に保持し、znode 間でデータを同期します。いずれかの制限値を超えると、メモリ圧迫によりサービスが不安定になったりクラッシュしたりします。
ZooKeeper は分散型の協調処理サービスであり、ファイルシステムではありません。znode 数が数十万に達している場合は、上流アプリケーションが ZooKeeper の本来の目的を超えて書き込みを行っていないか確認してください。
以下の制限値内に収めるようにしてください:
| リソース | 推奨される上限 |
|---|---|
| znode 数 | 100,000 未満 |
| スナップショットのサイズ | スナップショットあたり 800 MB 未満 |
znode 数の確認方法:E-MapReduce (EMR) コンソールのクラスタ詳細ページで、[モニタリング] タブを開きます。
スナップショットのサイズの確認方法:
ZooKeeper サービスページの [構成] タブで、
dataDirを検索し、データディレクトリのパスを特定します。次のコマンドを実行して、スナップショットファイルとそのサイズの一覧を表示します:
ls -lrt /mnt/disk1/zookeeper/data/version-2/snapshot*
いずれかの制限値を超えた場合は、znode の分布状況を確認したうえで、znode の分布に基づいて ZooKeeper へ過剰に書き込みを行う上流アプリケーションを停止してください。
サービスを停止せずに ZooKeeper のデータディレクトリを移行するにはどうすればよいですか?
ディスク領域が不足した場合やディスクのパフォーマンスが低下した場合、ZooKeeper のデータディレクトリを新しいパスに移行します。移行時は、まずフォロワーを対象に処理を行い、その後リーダーを対象に処理することで、移行中も ZooKeeper エンサンブル全体の可用性を維持できます。
以下の例では、/mnt/disk1/zookeeper から /mnt/disk2/zookeeper へ移行します。このクラスターでは、master-1-2 がリーダーであり、master-1-1 および master-1-3 がフォロワーです。
手順 1:データディレクトリの構成を更新
ZooKeeper サービスページの [構成] タブで、
dataDirを検索し、その値を/mnt/disk2/zookeeperに変更します。[保存] をクリックします。
[保存] ダイアログで、実行理由 を入力し、[保存] をクリックします。
手順 2:更新された構成を展開
[構成] タブの右上隅にある [クライアント構成の展開] をクリックします。
ダイアログで、実行理由 を入力し、[OK] をクリックします。
確認メッセージで、[OK] をクリックします。
手順 3:(任意)新しいデータディレクトリを確認
SSH モードで EMR クラスターにログインします。詳細については、「クラスターへのログイン」をご参照ください。
次のコマンドを実行し、
dataDirが/mnt/disk2/zookeeperを指していることを確認します:cat /etc/emr/zookeeper-conf/zoo.cfg
手順 4:各ノードでデータを移行
まず master-1-1 および master-1-3(フォロワー)に対して操作を行い、その後 master-1-2(リーダー)に対して操作を行います。
各ノードに対して以下を実行します:
ZooKeeper サービスページの [ステータス] タブで該当ノードを検索し、[アクション] 列の [停止] をクリックします。実行理由 を入力し、[OK] をクリックした後、再度 [OK] をクリックします。
マスターノードに SSH モードでログインし、次のコマンドを実行してデータディレクトリをコピーし、適切な権限を設定します:
sudo rm -rf /mnt/disk2/zookeeper && sudo cp -rf /mnt/disk1/zookeeper /mnt/disk2/zookeeper && sudo chown hadoop:hadoop -R /mnt/disk2/zookeeper[ステータス] タブで該当ノードを検索し、[アクション] 列の [開始] をクリックします。実行理由 を入力し、[OK] をクリックした後、再度 [OK] をクリックします。
次に進む前に、該当ノードの ヘルスステータス が 正常 になるまでページを更新します。
すべてのノードの ヘルスステータス が 正常 と表示された時点で、移行は完了です。