복붙노트

[HADOOP] HDFS에서 N 일보다 오래된 디렉토리 찾기

HADOOP

HDFS에서 N 일보다 오래된 디렉토리 찾기

hadoop fs -ls는 N 일 (현재 날짜부터)보다 오래된 모든 디렉토리를 찾는 데 사용할 수 있습니까?

나는 현재 날짜보다 N 일 전에 생성 된 HDFS (패턴 일치)의 모든 디렉토리를 찾아 삭제하는 정리 루틴을 작성하려고합니다.

해결법

  1. ==============================

    1.이 스크립트는 [days]보다 오래된 모든 디렉토리를 나열합니다.

    이 스크립트는 [days]보다 오래된 모든 디렉토리를 나열합니다.

    #!/bin/bash
    usage="Usage: $0 [days]"
    
    if [ ! "$1" ]
    then
      echo $usage
      exit 1
    fi
    
    now=$(date +%s)
    hadoop fs -lsr | grep "^d" | while read f; do 
      dir_date=`echo $f | awk '{print $6}'`
      difference=$(( ( $now - $(date -d "$dir_date" +%s) ) / (24 * 60 * 60 ) ))
      if [ $difference -gt $1 ]; then
        echo $f;
      fi
    done
    
  2. ==============================

    2.Hadoop의 CDH 배포를 사용하는 경우 Linux 찾기 명령처럼 작동하는 매우 유용한 HdfsFindTool 명령이 제공됩니다.

    Hadoop의 CDH 배포를 사용하는 경우 Linux 찾기 명령처럼 작동하는 매우 유용한 HdfsFindTool 명령이 제공됩니다.

    기본 소포 정보를 사용하는 경우 다음과 같이하십시오.

    hadoop jar /opt/cloudera/parcels/CDH/jars/search-mr-*-job.jar \
    org.apache.solr.hadoop.HdfsFindTool -find PATH -mtime +N
    

    PATH를 검색 경로로 대체하고 N을 일 수로 대체합니다.

  3. ==============================

    3.실제 클러스터의 경우에는 좋은 아이디어가 아닙니다. ls를 사용합니다. 관리자 권한이있는 경우, fsimage를 사용하는 것이 더 적합합니다.

    실제 클러스터의 경우에는 좋은 아이디어가 아닙니다. ls를 사용합니다. 관리자 권한이있는 경우, fsimage를 사용하는 것이 더 적합합니다.

    아이디어를 설명하기 위해 위의 스크립트를 수정합니다.

    먼저 fsimage 가져 오기

    curl "http://localhost:50070/getimage?getimage=1&txid=latest" > img.dump
    

    텍스트로 변환하십시오 (lsr과 동일한 출력).

    hdfs oiv -i img.dump -o fsimage.txt
    

    스크립트:

    #!/bin/bash
    usage="Usage: dir_diff.sh [days]"
    
    if [ ! "$1" ]
    then
      echo $usage
      exit 1
    fi
    
    now=$(date +%s)
    curl "http://localhost:50070/getimage?getimage=1&txid=latest" > img.dump
    hdfs oiv -i img.dump -o fsimage.txt
    cat fsimage.txt | grep "^d" | while read f; do 
      dir_date=`echo $f | awk '{print $6}'`
      difference=$(( ( $now - $(date -d "$dir_date" +%s) ) / (24 * 60 * 60 ) ))
      if [ $difference -gt $1 ]; then
        echo $f;
      fi
    done
    
  4. ==============================

    4.hdfs dfs -ls /hadoop/path/*.txt|awk '$ 6 < "2017-10-24"'

    hdfs dfs -ls /hadoop/path/*.txt|awk '$ 6 < "2017-10-24"'

  5. ==============================

    5.나는 HdfsFindTool이나 curl의 fsimage를 가지고 있지 않았고, awk와 hadoop, awk를 다시 사용하면서 while과 grep을하는 것을별로 좋아하지 않았다. 그러나 나는 그 해답을 높이 평가했다.

    나는 HdfsFindTool이나 curl의 fsimage를 가지고 있지 않았고, awk와 hadoop, awk를 다시 사용하면서 while과 grep을하는 것을별로 좋아하지 않았다. 그러나 나는 그 해답을 높이 평가했다.

    나는 그것이 단지 하나의 ls, 하나의 awk, 그리고 아마도 xargs로 할 수있는 것처럼 느꼈다.

    또한 파일을 나열하거나 삭제하기 전에 요약 할 수있는 옵션을 추가하고 특정 디렉토리를 선택했습니다. 마지막으로 디렉토리를 떠나 파일에 대해서만 염려합니다.

    #!/bin/bash
    USAGE="Usage: $0 [N days] (list|size|delete) [path, default /tmp/hive]"
    if [ ! "$1" ]; then
      echo $USAGE
      exit 1
    fi
    AGO="`date --date "$1 days ago" "+%F %R"`"
    
    echo "# Will search for files older than $AGO"
    if [ ! "$2" ]; then
      echo $USAGE
      exit 1
    fi
    INPATH="${3:-/tmp/hive}"
    
    echo "# Will search under $INPATH"
    case $2 in
      list)
        hdfs dfs -ls -R "$INPATH" |\
          awk '$1 ~ /^[^d]/ && ($6 " " $7) < '"\"$AGO\""
      ;;
      size)
        hdfs dfs -ls -R "$INPATH" |\
          awk '$1 ~ /^[^d]/ && ($6 " " $7) < "'"$AGO"'" {
               sum += $5 ; cnt += 1} END {
               print cnt, "Files with total", sum, "Bytes"}'
      ;;
      delete)
        hdfs dfs -ls -R "$INPATH" |\
          awk '$1 ~ /^[^d]/ && ($6 " " $7) < "'"$AGO"'" {print $8}' | \
          xargs hdfs dfs -rm -skipTrash
      ;;
      *)
        echo $USAGE
        exit 1
      ;;
    esac
    

    나는 다른 사람들이 이것을 유용하게 생각하기를 바랍니다.

  6. from https://stackoverflow.com/questions/12613848/finding-directories-older-than-n-days-in-hdfs by cc-by-sa and MIT license