Hadoop记录-HDFS均衡脚本

#!/bin/bash
#作用:hdfs使用率取最大100个主机和最小80个主机进行数据均衡
#打印报告
hdfs dfsadmin -report>report.txt
#截取主机名
cat report.txt | grep -i "hostname" | awk -F ': ' '{print $2}' >hostname.txt
#截取hdfs使用率
cat report.txt | grep -i "DFS Used%" | awk -F ': ' '{print $2}' | awk -F '%' '{print $1}' >dfsused.txt
#截取datanode存活数
livenum=$(cat report.txt | grep -i "Live datanodes" | awk -F "(" '{print $2}' | awk -F ")" '{print $1}')
#删除总的hdfs使用率
sed -i '1d' dfsused.txt
#截取存活datanode的hdfs使用率和主机名
dfsarr=((sed -n '1,$livenum p' dfsused.txt))
hostarr=((sed -n '1,$livenum p' hostname.txt))
#组合主机名和hdfs使用率一一对应起来
let livenum+=1
if [ $livenum -gt  0 ]
then
   for((i=1;i<$livenum;i++))
   do
    for((j=1;j<$livenum;j++))
    do
      if [ $i -eq $j ]
      then
         echo  ${hostarr[$i]} ":" ${dfsarr[$j]} >> hostdfs.txt
      fi
    done
   done
else
    echo "Not Live DataNodes"
fi
#获取使用率最大100个主机名和最小80台主机名(按第二列排序)
sort -rn -k 2 -t : hostdfs.txt | awk -F ":" '{print $1}' | head -n 100 >>host.txt
sort -rn -k 2 -t : hostdfs.txt | awk -F ":" '{print $1}' | tail -n 80 >>host.txt
#求平均值和最大值进行比较
avg_used=$(cat hostdfs.txt | awk -F ":" '{print $2*100}' | awk '{sum+=$1} END {print sum/NR}')
max_used=$(cat hostdfs.txt | awk -F ":" '{print $2*100}' | sort -rn | head -n 1)
diff_max_avg=$(($max_used-$avg_used))
#如果最大值与平均值的之差大于5,表示集群数据不均衡
if [ $diff_max_avg -gt 5 ]
then
    jps | grep -i "balancer"
    if [ $? -eq 0]
    then
       kill -9  $(jps | grep -i "balancer" | awk '{print $1}')
    else
       #对这些主机执行局部均衡
       hdfs   dfs  -rm   /system/balancer.id
       hdfs balancer  
       -Ddfs.datanode.balance.max.concurrent.moves = 10 \ 
       -Ddfs.balancer.moverThreads = 1024 \ 
       -Ddfs.balance.bandwidthPerSec = 104857600 \
       -policy  datanode  -threshold  5  -include -f host.txt
    fi
else 
    echo "Nothing to do"
fi

猜你喜欢

转载自www.cnblogs.com/xinfang520/p/11209731.html