2012-09-27 17 views
9

Kann Hadoop fs verwendet werden -Ls alle Verzeichnisse finden älter als N Tage (ab dem aktuellen Datum)?Finding Verzeichnisse älter als N Tage in HDFS

Ich versuche, eine saubere up-Routine zu schreiben, werden alle Verzeichnisse auf HDFS zu finden und löschen (mit einem Muster übereinstimmen), die vor N Tagen erstellt wurden, auf das aktuelle Datum.

+0

Einer der früheren Lösungen war teilweise hilfreich. Ich könnte ein Shell-Skript schreiben, um alle Verzeichnisse zu finden und zu löschen, die einem Muster entsprechen, aber was ich wirklich tun musste, war nur diejenigen zu löschen, die älter als N Tage waren. (Http://stackoverflow.com/questions/7733096/hadoop-bash-delete-filenames-matching-range) – vid12

Antwort

16

Dieses Skript listet alle Verzeichnisse, die älter sind als [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 
4

Für echte Cluster ist es keine gute Idee, ls zu verwenden. Wenn Sie Administratorrechte haben, ist besser geeignet, fsimage zu verwenden.

ich ändern Skript oben Idee zu illustrieren.

zuerst holen fsimage

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

wandeln es (gleiche Ausgabe wie lsr gibt), um Text

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

Script:

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

Könnten Sie bitte erklären, warum es besser ist, fsimage zu benutzen? – Aliaxander

+0

Wenn du Millionen Dateien hast, würde 'fs -ls' wahrscheinlich nicht funktionieren. So können Sie entweder Ihre eigenen Java-Code schreiben Dateisystem zu durchlaufen oder Dump fsimage einmal und führen Sie es und einfachen Unix-Tools viele nachfolgende Operationen. – octo

4

Wenn Sie CDH Verteilung geschehen sein mit von Hadoop kommt es mit einem sehr nützlichen HdfsFindTool Befehl, der verhält sich wie Linux find Befehl.

Wenn Sie die Standardpakete Informationen verwenden, hier ist, wie Sie es tun würde:

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

Wo Sie PATH mit dem Suchpfad ersetzen würde und N mit der Anzahl der Tage.

0

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

+0

bitte geben Sie eine korrekte Erklärung zu Ihrer Antwort. – Anmol

+0

hdfs dfs -ls /hadoop/path/*.txt - Dieser Teil wird alle TXT-Dateien awk ‚$ 6 <‚2017.10.24‘‘ suchen - dieser Teil für mit Konditionsdatum der Datei erstellen, überprüfen. –

Verwandte Themen