#!/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