셸 스 크 립 트 사례 (2): HDFS 파일 정기 정리

5594 단어 shell수송 하 다.
현재 환경의 HDFS 공간 사용률 은 95% 에 달 할 것 입 니 다. 수 동 으로 청소 하 는 것 이 비교적 번 거 롭 습 니 다. 스 크 립 트 를 써 서 최초 5 일의 로 그 를 정기 적 으로 정리 해 야 합 니 다.방법 중 하나:
케이스
hdfs 의 공간 점용 률 을 정기 적 으로 검사 하고 95% 를 넘 으 면 최초 5 일의 로그 파일 을 삭제 합 니 다.
해결 방향
  • 사용률 한도 값 설정
  • 현재 사용률 을 조회 하고 한도 값 에 도달 하면 최초 5 일의 파일 을 찾 습 니 다
  • 찾 은 파일 삭제
  • 문제.
  • Linux 셸 은 find 로 시간 을 통 해 파일 을 찾 을 수 있 지만 hdfs 셸 의 find 인 자 는 시간 으로 찾 을 수 없 을 것 같 습 니 다.따라서 dfs ls 의 파일 을 시간 정렬 해 야 합 니 다.최초의 서 류 를 찾 을 수 있 습 니 다.
  • hdfs dfs rm 은 파일 을 삭제 하 는 데 사 용 됩 니 다. 이 명령 은 파일 을 휴지통 으로 이동 시 키 고 휴지통 도 공간 을 차지 합 니 다.- skipTrash 인 자 를 사용 하면 영구적 으로 삭제 할 수 있 습 니 다.

  • 스 크 립 트 작성
    #!/bin/bash
    #   dfs    ,      
    
    day=5
    limit=95
    
    basedir=/app/applogs
    logfile=/app/scripts/logs/clear_hdfs_logs.log
    
    
    logger(){
      msg=$1
      cdate=$(date +%F)
      ctime=$(date '+%F %T')
      echo "$ctime  $1" >> ${logfile}_$cdate
    }
    
    find_logs(){
      n=$1
    
      # find year
      lasted_year=$(hdfs dfs -ls $basedir |awk -F'/' 'NR>1{print $NF}' |sort -n|head -n1)
      logger "lasted year: $lasted_year"
    
      # find month
      basedir_year=$basedir/$lasted_year
      lasted_month=$(hdfs dfs -ls $basedir_year |awk -F'/' 'NR>1{print $NF}' |sort -n|head -n1)
      logger "lasted_month: $lasted_month"
    
      # find day
      basedir_month=$basedir_year/$lasted_month
      lasted_days=$(hdfs dfs -ls $basedir_month |awk -F'/' 'NR>1{print $NF}' |sort -n|head -n$n)
    
      for i in $lasted_days
        do 
          rm_logs $basedir_month/$i
        done 
    
      # check empty dir, and delete 
      n1=$(hdfs dfs -ls $basedir_month |wc -l)
      if [ $n1 -eq 0 ];then
        rm_empty $basedir_month
      fi
    
      n2=$(hdfs dfs -ls $basedir_year |wc -l)
        if [ $n2 -eq 0 ];then
        rm_empty $basedir_year
      fi
    }
    
    rm_logs() {
      target=$1
      logger "clear old logs: hdfs dfs -rm -r -skipTrash $target"
      hdfs dfs -rm -r -skipTrash $target
    }
    
    rm_empty() {
      target=$1
      logger "clear empty dir: hdfs dfs -rm -r -skipTrash $target"
      hdfs dfs -rm -r -skipTrash $target
    }
    
    
    disk_used=$(hdfs dfsadmin -report|awk -F':|%' 'NR==5 {print $3}')
    
    if [ $(echo "$disk_used > $limit"|bc) -eq 1 ];then
      logger "current: $disk_used %, $limit +"
    
      find_logs $day
    else
      logger "current: $disk_used %, $limit -, exit "
    fi
    

    좋은 웹페이지 즐겨찾기