[HADOOP] HDFS에서 N 일보다 오래된 디렉토리 찾기
HADOOPHDFS에서 N 일보다 오래된 디렉토리 찾기
hadoop fs -ls는 N 일 (현재 날짜부터)보다 오래된 모든 디렉토리를 찾는 데 사용할 수 있습니까?
나는 현재 날짜보다 N 일 전에 생성 된 HDFS (패턴 일치)의 모든 디렉토리를 찾아 삭제하는 정리 루틴을 작성하려고합니다.
해결법
-
==============================
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.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.실제 클러스터의 경우에는 좋은 아이디어가 아닙니다. 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.hdfs dfs -ls /hadoop/path/*.txt|awk '$ 6 < "2017-10-24"'
hdfs dfs -ls /hadoop/path/*.txt|awk '$ 6 < "2017-10-24"'
-
==============================
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
나는 다른 사람들이 이것을 유용하게 생각하기를 바랍니다.
from https://stackoverflow.com/questions/12613848/finding-directories-older-than-n-days-in-hdfs by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Spark + 스칼라 변환, 불변성 및 메모리 소비 간접비 (0) | 2019.06.04 |
---|---|
[HADOOP] Hiveserver2 Thrift Java 클라이언트를 사용할 때 요청이 중단됨 (0) | 2019.06.04 |
[HADOOP] Hadoop Writable과 java.io.serialization의 연결 및 차이점은 무엇입니까? (0) | 2019.06.04 |
[HADOOP] 일식에서 mapreduce 일을 시작하십시오 (0) | 2019.06.04 |
[HADOOP] Hadoop-common, Hadoop-core 및 Hadoop-client의 차이점은 무엇입니까? (0) | 2019.06.04 |