实现背景
生产环境中经常超100台DataNode节点,如果要对DataNode解除授权一个一个点显得很麻烦,所以这里使用Cloudera Manager API方式去执行会更方便一些,下面将介绍实现过程以及脚本的编写。
CM API 对DataNode 解除授权
执行命令示例
curl -X POST -u admin:admin --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"items": ["hdfs-DATANODE-86ac5a45e263c789b408f2abced424dc"]}' 'http://cm111:7180/api/v32/clusters/Cluster%201/services/hdfs/commands/decommission'
下面是使用工具脚本来执行,步骤如下
1、获取所有DataNode 名称信息
#!/bin/bash
#置空文件
>/tmp/dn_commissioned.list
>/tmp/dn_decommissioned.list
roleFile="/tmp/roles_datanode.json"
curl -X GET -u admin:admin --header 'Accept: application/json' 'http://cm111:7180/api/v32/clusters/Cluster%201/services/hdfs/roles?view=SUMMARY' > ${roleFile}
# 获取JSON文件中总条目数量
json_length=$(cat ${roleFile} | jq '.items | length')
# 遍历JSON文件中的条目
for ((i=0; i<${json_length}; i++))
do
# 过滤出datanode角色并获取名称字段的值
role_name=`cat ${roleFile} | jq --argjson i "$i" '.items[$i] | select(.type == "DATANODE") | .name'`
host_name=`cat ${roleFile} | jq --argjson i "$i" '.items[$i]["hostRef"]["hostname"]'`
commissionState=`cat ${roleFile} | jq -r --argjson i "$i" '.items[$i] | select(.type == "DATANODE") | .commissionState'`
if [ ${role_name} <> null ] && [ "$commissionState" != "DECOMMISSIONED" ];then
echo ${role_name} ${host_name} ${commissionState} >> /tmp/dn_commissioned.list
elif [ ${role_name} <> null -a $commissionState == "DECOMMISSIONED" ];then
echo ${role_name} ${host_name} ${commissionState} >> /tmp/dn_decommissioned.list
fi
done
解释:
/tmp/dn_commissioned.list 保存未解除授权的DataNode文件
/tmp/dn_decommissioned.list 保存已解除授权的DataNode文件
最终文本示例
[root@test tmp]# more dn_commissioned.list
"hdfs-DATANODE-a706c810dfe0b894616e4344a2a712ab" "cm113" COMMISSIONED
"hdfs-DATANODE-86ac5a45e263c789b408f2abced424dc" "test" COMMISSIONED
"hdfs-DATANODE-eb2c4c7ae5600c11866a3365d9b09380" "cm111" COMMISSIONED
"hdfs-DATANODE-54c4ef0683d9e368f02010eb628b97ba" "cm112" COMMISSIONED
#解释
DataNode角色名称 对应的主机 是否已解除授权标识
2、执行解除授权脚本
脚本如下exec_dndecommissioned.sh
#!/bin/bash
cat /tmp/dn_operation.list| while read line
do
sleep 30
dn_name=`echo ${line} |awk -F " " '{print $1}'`
curl_argument="'{\"items\": [${dn_name}]}'"
exec_str="curl -X POST -u admin:admin --header 'Content-Type: application/json' --header 'Accept: application/json' \
-d $curl_argument \
'http://cm111:7180/api/v32/clusters/Cluster%201/services/hdfs/commands/decommission'"
eval $exec_str
done
注:每执行一次就相当于在页面点击一次解除授权命令