Cloudera Manager 中如何正确的下线节点
2017-07-14 本文已影响303人
大数据之心
最低要求的角色:超级管理员(所谓超级管理员就是 admin)
可以通过两种方式从集群中删除主机:
- 使用 Cloudera Manager 删除;
- 从集群 A 中删除主机,将其提供给由 Cloudera Manager 管理的其他集群;
两种方法都会涉及退役主机(decommission)、删除角色(role)、删除托管服务软件(service),但最终都会保留数据目录。
使用 Cloudera Manager 删除主机
- 在 Cloudera Manager 管理控制台中,单击
Hosts
选项卡,在All Hots
中:
- 选择要删除的主机;
- 选择 Actions for Selected > Decommission;
这里需要注意 3 点:
- 尤其是运行了 hdfs datanode、kafka broker 这样的数据节点,退役节点所需时间和数据量线性正相关;
- 请勿同时下线 2 台或者以上的数据节点,可能会造成数据丢失;
- 必须要等待这一步执行完成才可以进行下一步操作;
- 停止 cloudera-scm-agent:
pssh -h list_cm_agent "sudo systemctl stop cloudera-scm-agent"
- 确认进程停止:
pssh -h list_cm_agent -P "ps aux | grep 'cloudera-scm-agent.pid' | grep -v grep"
- 在 Cloudera Manager 管理控制台中,单击
Hosts
选项卡; - 重新选择步骤 2 中选择的主机;
- 选择 Actions for Selected > Delete;
从集群中删除主机
该操作可以把节点从集群中挪走,但是保留 Cloudera 管理服务角色(如 ServiceMonitor 等)。
- 在 Cloudera Manager 管理控制台中,单击
Hosts
选项卡; - 选择要删除的主机;
- 选择 Actions for Selected > Remove From Cluster 。将显示 "Remove Hosts From Cluster" 对话框;
- 跳过移除 Cloudera 管理服务角色的步骤,单击 "Confirm" 以完成删除选定的主机;
常见问题
Q:如果没有按照如上步骤正确删除主机,可能会导致主机仍然在 All Hosts
列表中,但是实际已经下线。这样走 7180 endpoint 的监控脚本就会产生误报,类似信息大致如下:
HOST_AGENT_LOG_DIRECTORY_FREE_SPACE=NOT_AVAILABLE, HOST_AGENT_PARCEL_DIRECTORY_FREE_SPACE=NOT_AVAILABLE, HOST_AGENT_PROCESS_DIRECTORY_FREE_SPACE=NOT_AVAILABLE, HOST_CLOCK_OFFSET=NOT_AVAILABLE, HOST_DNS_RESOLUTION=NOT_AVAILABLE, HOST_MEMORY_SWAPPING=NOT_AVAILABLE, HOST_NETWORK_FRAME_ERRORS=NOT_AVAILABLE, HOST_NETWORK_INTERFACES_SLOW_MODE=NOT_AVAILABLE, HOST_SCM_HEALTH=BAD
A:对于 CM Manager 来说,它会把主机元数据全部存放在 DB 里,对应的表为 ${DATABASE}.HOSTS
,我们只要删除对应的僵尸机器记录即可,数据库名称一般是默认的 cm
:
DELETE FROM cm.HOSTS WHERE HOST_ID='${HOST_ID}';
但是可能会因为之前执行过的指令和该行记录产生了外键依赖而删除不了,报类似外键依赖的错,那么就首先需要删除对应的 COMMANDS
表的记录:
DELETE FROM cm.AUDITS WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.CLIENT_CONFIGS_TO_HOSTS WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.COMMANDS WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.COMMANDS_SCHEDULES WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.CONFIGS WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.CONFIGS_AUD WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.HOSTS_AUD WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.PROCESSES WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.ROLES WHERE HOST_ID='${HOST_ID}';
DELETE FROM cm.ROLES_AUD WHERE HOST_ID='${HOST_ID}';
然后再执行删除:
SET FOREIGN_KEY_CHECKS = 0
DELETE FROM cm.HOSTS WHERE HOST_ID='${HOST_ID}';
SET FOREIGN_KEY_CHECKS = 1